
三種預處理詳解
1、宏定義指令
宏定義了一個代表特定內容的標識符。預處理過程會把源代碼中出現的宏標識符替換成宏定義時的值。
宏最常見的用法是定義代表某個值的全局符號;而第二種用法是定義帶參數的宏(宏函數),這樣的宏可以象函數一樣被調用,但它是在調用語句處展開宏,并用調用時的實際參數來代替定義中的形式參數。
#define指令:
#define預處理指令用來定義宏。該指令最簡單的格式是:聲明一個標識符,給出這個標識符代表的代碼(比如像圓周率這樣的數)。在后面的源代碼中,我們就可以使用定義的宏取代要使用的代碼,代碼舉例:
#define PI 3.141592654
使用宏的好處有兩點:
一是使用方便。如下:
#define PI 3.1415926
PI顯然比3.1415926寫著方便。
二是定義的宏有了意義,可讀性強。如例1,MAX_NUM,望文生意便知是最大數量的意思,比單純使用10這個數字可讀性要強的多。
三是容易修改。如例1,如果在程序中有幾十次會使用到MAX_NUM,修改只需要在宏定義里面修改一次就可以,否則你會修改到崩潰。
2、條件編譯指令
程序員可以通過定義不同的宏來決定編譯程序對哪些代碼進行處理。條件編譯指令將決定哪些代碼被編譯,而哪些是不被編譯的。可以根據表達式的值或者某個特定的宏是否被定義來確定編譯條件。
#if/#endif/#else/#elif指令:
#if指令檢測跟在制造另關鍵字后的常量表達式。如果表達式為真,則編譯后面的代碼,直到出現#else、#elif或#endif為止;否則就不編譯。
#endif用于終止#if預處理指令。
#else指令用于某個#if指令之后,當前面的
#if指令的條件不為真時,就編譯
#else后面的代碼。
代碼舉例:
#define DEBUG //此時#ifdef DEBUG為真
//#define DEBUG 0 //此時為假
int main()
{
#ifdef DEBUG
printf("Debuggingn");
#else
printf("Not debuggingn");
#endif
printf("Runningn");
return 0;
}
這樣我們就可以實現debug功能,每次要輸出調試信息前,只需要#ifdef DEBUG判斷一次。不需要了就在文件開始定義#define DEBUG 0
#elif預處理指令綜合了#else和#if指令的作用。
3、頭文件包含指令
采用頭文件的目的主要是為了使某些定義可以供多個不同的C源程序使用。因為在需要用到這些定義的C源程序中,只需加上一條#include語句即可,而不必再在此文件中將這些定義重復一遍。預編譯程序將把頭文件中的定義統統都加入到它所產生的輸出文件中,以供編譯程序對之進行處理。
#include預處理指令的作用是在指令處展開被包含的文件。包含可以是多重的,也就是說一個被包含的文件中還可以包含其他文件。標準C編譯器至少支持八重嵌套包含。預處理過程不檢查在轉換單元中是否已經包含了某個文件并阻止對它的多次包含,這個的處理辦法上面已經給出。
在程序中包含頭文件有兩種格式:
#include
#include "my.h"
第一種方法是用尖括號把頭文件括起來。這種格式告訴預處理程序在編譯器自帶的或外部庫的頭文件中搜索被包含的頭文件。
第二種方法是用雙引號把頭文件括起來。這種格式告訴預處理程序在當前被編譯的應用程序的源代碼文件中搜索被包含的頭文件,如果找不到,再搜索編譯器自帶的頭文件。
采用兩種不同包含格式的理由在于,編譯器是安裝在公共子目錄下的,而被編譯的應用程序是在它們自己的私有子目錄下的。一個應用程序既包含編譯器提供的公共頭文件,也包含自定義的私有頭文件。采用兩種不同的包含格式使得編譯器能夠在很多頭文件中區別出一組公共的頭文件。
預編譯程序所完成的基本上是對源程序的“替代”工作。經過此種替代,生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。這個文件的含義同沒有經過預處理的源文件是相同的,但內容有所不同。下一步,此輸出文件將作為編譯程序的輸出而被翻譯成為機器指令。
審核編輯:湯梓紅
-
C語言
+關注
關注
180文章
7630瀏覽量
140477 -
編譯
+關注
關注
0文章
676瀏覽量
33761 -
預處理
+關注
關注
0文章
33瀏覽量
10610 -
宏定義
+關注
關注
0文章
51瀏覽量
9182
發布評論請先 登錄
STVD中如何設置預編譯選項?
請問有文檔描述ZigBee預編譯宏定義含義嗎?
未能獲得預編譯的模擬庫信息
什么是預編譯
Verilog 預編譯
X-CUBE-IOTA v1.2.0預編譯版不起作用的原因?如何解決?
編譯器如何處理使用預編譯庫SMING文件編譯的應用程序中未使用的庫?
C語言編譯器常見的預編譯指令詳細資料說明

"最常見"卻又"最不常用"的三個預編譯
C語言中常見預編譯指令的靈活秒用
淺談預編譯指令常見用法

什么是預編譯

評論