C語言_預處理
C語言_預處理
文章目錄
0.引言
C的預處理是在程式被編譯之前執行的,包括將其他檔案包含進正在編譯的檔案,定義符號常量和巨集,條件編譯和有條件的執行預處理命令。預處理命令都以 # 開頭。
1.#include
功能:將指定檔案的一個副本包含到命令所在位置上
形式:#include<filename>
#include"filename"
區別:查詢檔案的起始位置不同。
使用引號時:會從待編譯檔案所在的目錄裡開始查詢,一般用於程式設計師自己定義的標頭檔案
使用尖括號:用於標準函式庫的標頭檔案,一般會在預先指定的編譯器和系統目錄中開始查詢
2.#define (符號常量)
格式:#define indentifier replacement_text
功能:其後出現的所有識別符號(indentifier)會在編譯前被替換為後面的替換文字
p.s.習慣上只用大寫字母和下劃線給符號常量命名
這也是一種巨集,此處拆開只是為了單獨說明,而且它也更常用
得到符號常量的另一途徑:利用關鍵字const進行修飾
3.#define(巨集)
巨集 ,是#define預處理命令定義的一種識別符號,巨集的定義可以帶實參,也可以不帶。不帶實參的巨集和上面的符號常量類似;而帶實參的巨集會把實參帶入巨集的替換文字中,進行展開
例子(帶實參):
#define RECTANGLE_AREA(x,y) ( (x) * (y) )
rectArea = RECTANGLE_AREA(a + 4, b + 7);
//in fact, it will be replaced by:
rectArea = (a + 4) * (b + 7);
p.s.巨集可以用 #undef
撤銷
4.條件編譯
功能:只對滿足條件的程式碼進行編譯
形式:#if
, #ifdef
#ifndef
1)#if
和if,else,else if的使用很像,方法如下:
#if 整型常量表達式1
程式碼塊1
#elif 整型常量表達式2
程式碼塊2
#elif 整型常量表達式3
程式碼塊3
#else
程式碼塊4
#endif
2)#ifdef
#ifdef 巨集名
程式碼塊1
#else
程式碼塊2
#endif
意思是 如果所給出的巨集已經被定義過(即存在),則判定為真,編譯1,否則編譯2
3)#ifndef
#ifndef 巨集名
程式碼塊1
#else
程式碼塊2
#endif
與#ifdef類似,區別在於 巨集名 處的判定是判斷巨集是否未定義,如果未定義,編譯1;否則編譯2
5.#error和#pragma預處理命令
格式:#error tokens
功能:打印出包含命令中指定標記的資訊,具體內容和系統的實現有關。
tokens是用空格分隔的一個字元序列
格式:#pragma tokens
功能:執行一個系統實現中已經定義好的操作,如果沒找到就忽略這個命令
6.#和##運算子
#:#運算子需用在帶實參的巨集中,其運算元就是巨集的實參,它將替換文字中的標記轉換成一個用引號引起來的字串。
例子:
#define HELLO(x) printf("hello," # "\n");
//when we meet"HELLO(Mary)", it become:
printf("hello," "Mary" "\n");
//==
printf("hello,Mary\n");
##:用於將兩個標記拼接在一起
例子:
#define EXAMPLE(x,y) x##y
//in the below code,when meet:
EXAMPLE(O,K)
//it will be replaced by:
EXAMPLE(OK)
例子:
#define EXAMPLE(x,y) x##y
//in the below code,when meet:
EXAMPLE(O,K)
//it will be replaced by:
EXAMPLE(OK)
注意:##運算子必須有兩個運算元