define巨集定義中的#,
##,@#及
\符號(zt) 1、
# (stringizing
)字串化操作符。其作用是:將巨集定義中的傳入引數名轉換成用一對雙引號括起來引數名字串。其只能用於有傳入引數的巨集定義中,且必須置於巨集定義體中的引數名前。 如:
#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";
注意:
對空格的處理
a。忽略傳入引數名前面和後面的空格。 如:
str=example1( abc )
; 將會被擴充套件成
str="abc";
b.當傳入引數名間存在空格時,編譯器將會自動連線各個子字串,用每個子字串中只以乙個空格連線,忽略其中多餘乙個的空格。 如:
str=exapme( abc def);
將會被擴充套件成
str="abc def";
2、## (
token-pasting
)符號連線操作符
巨集定義中:引數名,即為形參,如#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.連線後的實際引數名,必須為實際存在的引數名或是編譯器已知的巨集定義
// preprocessor_token_pasting.cpp
#include
#define paster( n ) printf_s( "token" #n " = %d", token##n )
int token9 = 9;
int main()
paster(9);
執行結果:
token9 = 9
3、@#
(charizing
)字元化操作符。
只能用於有傳入引數的巨集定義中,且必須置於巨集定義體中的引數名前。作用是將傳的單字元引數名轉換成字元,以一對單引用括起來。
#define makechar(x) #@x
a = makechar(b);
展開後變成了:
a= 'b';
4、\
行繼續操作符
當定義的巨集不能用一行表達完整時,可以用"\"
表示下一行繼續此巨集的定義。
注意:換行不能切斷單詞,只能在空格的地方進行。
在#define
中,標準只定義了#和
##兩種操作。
#用來把引數轉換成字串,
##則用來連線兩個前後兩個引數,把它們變成乙個字串。
#include
#define paster( n ) printf( "token " #n" = %d\n ", token##n )
int main()
輸出為[leshy@leshy src]$ ./a.out
token 9 = 10
C C 巨集 巨集的作用 副作用
基礎 巨集是預處理指令 巨集的本質是簡單的字串替換,預處理時進行巨集替換 可在定義巨集時要求它接收引數,巨集替換時會代入引數 巨集的名字不允許過載 巨集預處理 沒有能力處理遞迴呼叫。作用 看一段math.h中的巨集定義 if defined use math defines defined math...
C C 的巨集中 和 的作用和展開
c c 的巨集中,的功能是將其後面的巨集引數進行字串化操作,簡單說就是在對它所引用的巨集變數通過替換後在其左右各加上乙個雙引號。連線符號由兩個井號組成,其功能是在帶引數的巨集定義中將兩個子串聯接起來,從而形成乙個新的子串。但它不可以是第乙個或者最後乙個子串。凡是巨集定義裡有用 或 的地方巨集引數是不...
offsetof巨集的原理以及作用
原理 虛擬乙個type型別的結構體變數,通過type.member的方式來訪問member成員,進而得到member成員相對於整個結構體首位址的偏移量。作用 為接下來的container of巨集的講解出現做鋪墊 offsetof巨集 define offsetof type,member int ...