溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

詳解C++中的#、##和

發(fā)布時(shí)間:2020-11-03 17:21:37 來(lái)源:億速云 閱讀:143 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這期內(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!串。

詳解C++中的#、##和

即p1,p2,p3,p4這四種寫(xiě)法是等價(jià)的,這一點(diǎn)作為之后解釋#用法的前提。

字符串化操作(#)

當(dāng)用作字符串化操作時(shí),#的主要作用是將宏參數(shù)不經(jīng)擴(kuò)展地轉(zhuǎn)換成字符串常量。

要點(diǎn):

  • 宏定義參數(shù)的左右兩邊的空格會(huì)被忽略,參數(shù)的各個(gè)Token之間的多個(gè)空格會(huì)被轉(zhuǎn)換成一個(gè)空格。
  • 宏定義參數(shù)中含有需要特殊含義字符如"或\時(shí),它們前面會(huì)自動(dòng)被加上轉(zhuǎ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):

  • 它不能是宏定義中的第一個(gè)或最后一個(gè)Token。
  • 前后的空格可有可無(wú)。

來(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)該如下:

  • paster(9);
  • printf_s( "token" #9 " = %d", token##9 );
  • printf_s( "token" "9" " = %d", token9 );
  • printf_s( "token9 = %d", token9 );

這樣應(yīng)該就很好理解了。

上述就是小編為大家分享的詳解C++中的#、##和了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

c++
AI