您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)詳解C++中的#、##和,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
在學(xué)習(xí)#
和##
之前,先來(lái)看一個(gè)關(guān)于"的例子:
#include <stdio.h> #include <string.h> int main() { const char* p1 = "Hello," "World!"; // 一個(gè)空格 const char* p2 = "Hello," "World!"; // 多個(gè)空格 const char* p3 = "Hello,""World!"; // 沒(méi)有空格 const char* p4 = "Hello,World!"; // 一個(gè)整串 const char* p5 = "Nihao,""Shijie!"; // 一個(gè)不同的串 printf("p1 = %s, strlen(p1) = %d\n", p1, strlen(p1)); printf("p2 = %s, strlen(p2) = %d\n", p2, strlen(p2)); printf("p3 = %s, strlen(p3) = %d\n", p3, strlen(p3)); printf("p4 = %s, strlen(p4) = %d\n", p4, strlen(p4)); printf("p5 = %s, strlen(p5) = %d\n", p5, strlen(p5)); return 0; }
輸出為:
p1 = Hello,World!, strlen(p1) = 12
p2 = Hello,World!, strlen(p2) = 12
p3 = Hello,World!, strlen(p3) = 12
p4 = Hello,World!, strlen(p4) = 12
p5 = Nihao,Shijie!, strlen(p5) = 13
查看PE文件的常量字符串段,發(fā)現(xiàn)經(jīng)過(guò)編譯器優(yōu)化后只存在一個(gè)Hello,World
!串。
即p1,p2,p3,p4這四種寫(xiě)法是等價(jià)的,這一點(diǎn)作為之后解釋#
用法的前提。
字符串化操作(#)
當(dāng)用作字符串化操作時(shí),#
的主要作用是將宏參數(shù)不經(jīng)擴(kuò)展地轉(zhuǎn)換成字符串常量。
要點(diǎn):
還是通過(guò)MSDN上的例子來(lái)看看容易懂:
#define F abc #define B def #define FB(arg) #arg #define FB1(arg) FB(arg) FB(F B) FB1(F B)
初看到時(shí)推測(cè)這兩行預(yù)編譯出來(lái)后效果是一樣的,但是看了使用gcc -E編譯出來(lái)代碼,這才理解了MSDN上對(duì)“不經(jīng)擴(kuò)展”有了更深刻的理解,實(shí)際的預(yù)編譯后代碼為:
"F B"; "abc def";
推測(cè)變換過(guò)程應(yīng)該如下:
FB(F B) --> #F B -->"F B" FB1(F B) --> FB1(abc def) --> FB(abc def) --> #abc def --> "abc def"
標(biāo)記連接操作(##)
將多個(gè)Token連接成一個(gè)Token。
要點(diǎn):
來(lái)理解一下MSDN上舉的例子:
#include <stdio.h> #define paster( n ) printf_s( "token" #n " = %d", token##n ) int token9 = 9; int main() { paster(9); }
paster(9);
的預(yù)處理步驟應(yīng)該如下:
這樣應(yīng)該就很好理解了。
上述就是小編為大家分享的詳解C++中的#、##和了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。