**:
c/c++的預處理定義:
一。stringizing operator (#)
在c和c++中數字標誌符#被賦予了新的意義,即字串化操作符。其作用是:將巨集定義中的傳入引數名轉換成用一對雙引號括起來
引數名字串。其只能用於有傳入引數的巨集定義中,且必須置於巨集定義體中的引數名前。
如:#define example(instr) printf("the input stringis:/t%s/n",#instr)
#define example1(instr) #instr
當使用該巨集定義時:
example(abc); 在編譯時將會展開成:printf("the input stringis:/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='b';
注意:vc6.0和vc7.0中預設的型別轉換中,可以將int截斷成char。因此,引數名中最多不能超過4個字元。
如:char a=example(abcd) 將會截斷成 a='d'。同時編譯器會給出:warningc4305: 「=」 : 從「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.連線後的實際引數名,必須為實際存在的引數名或是編譯器已知的巨集定義。
C C 編譯預處理
今天做練習用到頭檔案包含時遇到了 redefinition 的報錯。仔細一看才發現是 我沒有很好地使用條件編譯來協調標頭檔案包含關係 平常說的 標頭檔案衛士 就這麼回事 於是找來塵封已久的 c預處理程式 在用c編譯程式對c源 進行編譯之前,即在語法分析 生成和優化之前,由c 預處理程式對源 進行第一...
C C 預處理命令
1.和 和 操作符是和 define 巨集使用的。使用 使在 後的首個引數返回為乙個帶引號的字串 例如 defineto string s s defineconcatenate x,y x y 2.define 命令用於把指定字串替換檔案中的巨集名稱 3.error 可以簡單的使編譯器在發生錯誤時...
C C 編譯預處理
1.c c 編譯預處理 預處理 或稱預編譯 是指在進行編譯的第一遍掃瞄 詞法掃瞄和語法分析 之前所作的工作。預處理指令指示在程式正式編譯前就由編譯器進行的操作,可放在程式中任何位置。預處理是 c語言的乙個重要功能,它由預處理程式負責完成。當對乙個原始檔進行編譯時,系統將自動引用預處理程式對源程式中的...