您好,登錄后才能下訂單哦!
這篇文章主要講解了“C語言宏定義中的#和##是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C語言宏定義中的#和##是什么”吧!
記號串化可以將函數(shù)式宏定義中的實(shí)參轉(zhuǎn)換為字符串。在函數(shù)式宏定義中,如果替換列表中有“#”,則其后的預(yù)處理記號必須是當(dāng)前宏的形參。在預(yù)處理期間,“#”連同它后面的形參一起被實(shí)參取代。例如
#include <stdio.h> #define PSQR(x) printf("The square of " #x " is %d.\n",((x)*(x))) int main(void) { int y = 5; PSQR(y); PSQR(2 + 4); PSQR( 3 * 2 ); return 0; }
程序運(yùn)行結(jié)果如下:
第1次調(diào)用宏時(shí),用"y"替換#x。第2次調(diào)用宏時(shí),用"2 + 4"替換#x。第3次調(diào)用宏時(shí),用"3 * 2"替換#x。
ANSI C字符串的串聯(lián)特性將這些字符串與printf()語句的其他字符串組合,生成最終的字符串。例如,第1次調(diào)用變成:
printf("The square of " "y" " is %d.\n",((y)*(y)));
然后,字符串串聯(lián)功能將這3個(gè)相鄰的字符串組合成一個(gè)字符串:
"The square of y is %d.\n"
如果傳入的實(shí)參中間有空白,則不管有多少,都被轉(zhuǎn)換為一個(gè)空格,參數(shù)開頭和末尾的空白都被刪除。例如第3次調(diào)用宏時(shí),實(shí)參“3 * 2 ”轉(zhuǎn)換為“3 * 2”。
與#運(yùn)算符類似,##運(yùn)算符可用于函數(shù)式宏的替換部分,它把兩個(gè)記號組合成一個(gè)記號。例如,可以這樣定義函數(shù)式宏:
#define XNAME(n) x ## n
然后,展開宏XNAME(4)為x4。
記號黏結(jié)的作用是將幾個(gè)預(yù)處理記號合并為一個(gè)。在一個(gè)函數(shù)式宏定義中,如果一個(gè)預(yù)處理記號的前面或者后面有"##",則該記號將與它前面或者后面的記號合并,如果該預(yù)處理記號是宏的形參,則用實(shí)參執(zhí)行合并。例如:
#define F(x, y, z) x##y##r char F(a, b, c);
第2行的宏調(diào)用,其擴(kuò)展之后如下:
char abr;
需要注意的是,在函數(shù)式宏定義中,“##”不能位于替換列表的開頭和結(jié)尾。
#include <stdio.h> #define XNAME(n) x ## n #define PRINT_XN(n) printf("x" #n " = %d\n", x ## n); int main(void) { int XNAME(1) = 14; // 轉(zhuǎn)換為 x1 = 14; int XNAME(2) = 20; // 轉(zhuǎn)換為 int x2 = 20; int x3 = 30; PRINT_XN(1); // 轉(zhuǎn)換為 printf("x1 = %d\n", x1); PRINT_XN(2); // 轉(zhuǎn)換為 printf("x2 = %d\n", x2); PRINT_XN(3); // 轉(zhuǎn)換為 printf("x3 = %d\n", x3); return 0; }
程序運(yùn)行結(jié)果如下。
#include <stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int main() { printf("h(f(1,2))展開為:%s\n",h(f(1,2))); printf("g(f(1,2))展開為:%s\n",g(f(1,2))); return 0; }
析:
宏展開順序大致可以歸結(jié)為:
第一步:首先用實(shí)參代替形參,將實(shí)參代入宏文本中
第二步:如果實(shí)參也是宏,則展開實(shí)參
第三步:最后繼續(xù)處理宏替換后的宏文本,如果仍包含宏,則繼續(xù)展開
注意:如果在第二步,實(shí)參代入宏文本后,實(shí)參之前或之后遇到#或##,實(shí)參不再展開
根據(jù)以上宏展開步驟分析第8行的宏調(diào)用h(f(1,2)),其展開步驟為:
h(f(1,2))-->g(f(1,2))-->g(1##2)-->g(12)-->"12"
第9行的宏調(diào)用g(f(1,2)),其展開步驟為:
g(f(1,2))-->#f(1,2)-->"f(1,2)"
上面程序運(yùn)行結(jié)果如下。
感謝各位的閱讀,以上就是“C語言宏定義中的#和##是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對C語言宏定義中的#和##是什么這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。