C語言再學習14——預處理(二)

前言:

爲了方便查看博客,特意申請了一個公衆號,附上二維碼,有興趣的朋友可以關注,和我一起討論學習,一起享受技術,一起成長。

在這裏插入圖片描述


1. #error

#error 的作用是:編譯程序時,只要遇到 #error 就生成一個編譯錯誤提示,並停止編譯。

//格式:
#error error-message

測試:

int main(void)
{
#define DEBUG_MODE
	printf("Debug \r\n");
#undef DEBUG_MODE

#ifndef DEBUG_MODE
#error DEBUG_MODE is not define,please check
#endif

	printf("main is running \r\n");
	system("pause");
	return 0;
}

在這裏插入圖片描述上述的代碼會觸發 #error 錯誤,便於定位錯誤的代碼位置。去掉 #undef DEBUG_MODE 後,上述程序可正常運行。

2. #line預處理

#line 的作用是改變當前行數和文件名稱。

//格式:
#line number["filename"]		//[]內的文件名可以省略

#line 30 a.h	//a.h可以省略不寫

解釋:這條指令可以改變當前的行號和文件名。#line 30 a.h 即爲改變當前的行號爲 30 ,文件名爲 a.h。通過這條指令,可以保證文件名是固定的,不會在編譯的過程中被中間文件代替,有利於進行分析。

測試:

#include <stdio.h>

#line 5 "Test.c"

int main(int argc, char* argv[]){
#define CONST_NAME1 "CONST_NAME1"
	printf("%s \r\n", CONST_NAME1);
#undef CONST_NAME1
	printf("%s \r\n", CONST_NAME1);
	{
#define CONST_NAME2 "CONST_NAME2"
		printf("%s \r\n", CONST_NAME2);
	}
	printf("%s \r\n", CONST_NAME2);
	system("pause");
	return 0;
}

注:#line 5 “Test.c” 表示把當前行設置爲第 5 行,並且文件名更改爲 Test.c,編譯後現象如下:出錯行數在實際行數的上一行?

在這裏插入圖片描述

補:#line 指令改變 __ LINE__ 和 __ FILE__ 的內容。 __ LINE__ 和 __ FILE__ 都是編譯程序中預定義的標識符。標識符 __ LINE__ 的內容是當前被編譯代碼行的行號,__ FILE__ 的內容是當前被編譯源文件的文件名。其作用在於編譯的時候,準確輸出出錯代碼所在的位置(行號),而在源程序中並不出現行號,從而方便程序員準確定位。

3. #pragma預處理

#pragma 的作用是設置編譯器的狀態或者是指示編譯器完成特定的動作。

#pragma para		//para 爲參數

3.1 #pragma message

message 參數:能夠在編譯信息輸出窗口輸出相應的信息,便於對源代碼的控制。當編譯器遇到這條指令時就在編譯窗口將消息文本打印出來。

#pragma message("output information")

測試:

#include <stdio.h>

#define _X86

int main(int argc, char* argv[]){

#ifdef _X86
#pragma message("X86 macro activatede!")
#endif

	system("pause");
	return 0;
}

現象:

在這裏插入圖片描述

3.2 #pragma code_deg

設置程序中函數代碼存放的代碼段。

格式:

#pragma code_deg(["section-name"[,"section-class"]])

3.3 #pragma once

只要在頭文件的最開始加入這條指令就能夠保證頭文件被編譯一次,但是考慮到兼容性並沒有太多的使用它。

#pragma once

3.4 #pragma hdrstop

#pragma hdrstop 表示預編譯頭文件到此爲止,後面的頭文件不進行預編譯。(注意:是不進行預編譯,而不是不進行編譯)

BCB 可以預編譯頭文件以加快鏈接的速度,但如果所有頭文件都進行預編譯又可能佔太多磁盤空間,使用這個選項排除一些頭文件。

有時單元之間有依賴關係,比如單元 A 依賴單元 B,所以單元 B 要先於單元 A 編譯。可以用 #pragma startup 指定編譯優先級,如果使用了 #pragma package(smart_init) ,BCB 就會根據優先級的大小先後編譯。

3.5 #pragma comment

該指令將一個註釋記錄放入一個對象文件或可執行文件中。

格式:

#pragma comment(......)

#pragma comment("lib,"user32.lib")	//將user32.lib 庫文件加入到本工程中

linker:將一個鏈接選項放入目標文件中,可以使用這個指令來代替由命令行傳入的或者在開發環境中設置的鏈接選項。例如指定 /include 選項來強制包含某個對象:

#pragma comment(linker, "/include:__mySymbol")
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章