C 的特殊預處理定義 和

2022-09-01 14:36:14 字數 1704 閱讀 2845

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...