c/c++的預處理定義:
一。stringizing operator (#)
在c和c++中數字標誌符#被賦予了新的意義,即字串化操作符。其作用是:將巨集定義中的傳入引數名轉換成用一對雙引號括起來的
引數名字串。其只能用於有傳入引數的巨集定義中,且必須置於巨集定義體中的引數名前。
如:#define example(instr) printf("the input string is:/t%s/n",#instr)
#define example1(instr) #instr
當使用該巨集定義時:
example(abc); 在編譯時將會展開成:printf("the input string is:/t%s/n","abc");
string str=example1(abc); 將會展成:string str="abc";
注意:1。對空格的處理
a。忽略傳入引數名前面和後面的空格。
如:str=example1( abc ); 將會被擴充套件成 str="abc";
b.當傳入引數名間存在空格時,編譯器將會自動連線各個子字串,用每個子字串中只以乙個空格連線,忽略其中多餘乙個的空格。
如:str=exapme( abc def); 將會被擴充套件成 str="abc def";
2。轉義字元
a. 某些形式的傳入引數名中,若存在特殊字元,編譯器會自動為其新增轉義字元號'/'。
如:string str=example1("escap'/e"); 相當於:str="/"escap/'//e/"";
b. vc6.0和vc7.0並不能正確的解析所有需要特殊字元的情況。此時會給出錯誤報告:error c2001: 常數中有換行符。
如:example1(abc/'); //此處報警 error c2001: 常數中有換行符
二。charizing operator (#@)
字元化操作符。其同樣只能用於有傳入引數的巨集定義中,且必須置於巨集定義體中的引數名前。作用,將傳的單字元引數名轉換成字元,以一對單引用括起來。
如:#define examplechar(inchar) #@inchar
使用該巨集定義:
char a=examplechar(a); 將會被擴充套件成:char a='a';
注意:vc6.0和vc7.0中預設的型別轉換中,可以將int截斷成char。因此,引數名中最多不能超過4個字元。
如:char a=example(abcd) 將會截斷成 a='d'。同時編譯器會給出:warning c4305: 「=」 : 從「int」到「char」截斷
三。token-pasting operator (##)
##:符號連線操作符。
巨集定義中:引數名,即為形參,如#define sum(a,b) (a+b);中a和b均為某一引數的代表符號,即形式引數。
而##的作用則是將巨集定義的多個形參成乙個實際引數名。
如:#define examplenum(n) num##n
int num9=9;
使用:int num=examplenum(9); 將會擴充套件成 int num=num9;
注意:1.當用##連線形參時,##前後的空格可有可無。
如:#define examplenum(n) num ## n 相當於 #define examplenum(n) num##n
2.連線後的實際引數名,必須為實際存在的引數名或是編譯器已知的巨集定義。
預處理定義
預處理也稱為預編譯,它為編譯做預備工作,主要進行 文字的替換工作,用於處理 開頭的指令,其中預處理器產生編譯器的輸出。經過預處理器處理的源程式會有所不同,在預處理階段所進行的工作只是純粹的替換和展開,沒有任何計算功能。常見指令如下 define 巨集定義 undef 未定義巨集 include 文字...
C語言 預處理和巨集定義
今天分享一點c語言的預處理還有巨集相關的內容。目錄 預處理和巨集定義 一 乙個c程式的誕生 1 預編譯階段 c i 2 編譯階段 i s 3 彙編階段 s o 4 鏈結階段 該程式的所有.o exe 1 c語言中部分內建巨集 2 巨集的功能 1 使用巨集定義常量 2 使用巨集重新命名運算子 3 使用...
C 預處理 巨集定義
開發乙個 c語言程式,讓它暫停 5 秒以後再輸出內容 helllo 並且要求跨平台,在 windows 和 linux 下 include 說明 在windows 作業系統和 linux作業系統下,生成原始碼不一樣 if win32 如果是windows平台,就執行 include elif lin...