c c 的預處理

2021-07-11 20:12:09 字數 1717 閱讀 2166

**:

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語言的乙個重要功能,它由預處理程式負責完成。當對乙個原始檔進行編譯時,系統將自動引用預處理程式對源程式中的...