中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-11-03 17:21:37 來源:億速云 閱讀:140 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關詳解C++中的#、##和,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

在學習###之前,先來看一個關于"的例子:

#include <stdio.h> 
#include <string.h> 
 
int main() 
{ 
 const char* p1 = "Hello," "World!";  // 一個空格 
 const char* p2 = "Hello," "World!"; // 多個空格 
 const char* p3 = "Hello,""World!";  // 沒有空格 
 const char* p4 = "Hello,World!";  // 一個整串 
 const char* p5 = "Nihao,""Shijie!"; // 一個不同的串 
 
 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文件的常量字符串段,發現經過編譯器優化后只存在一個Hello,World!串。

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

即p1,p2,p3,p4這四種寫法是等價的,這一點作為之后解釋#用法的前提。

字符串化操作(#)

當用作字符串化操作時,#的主要作用是將宏參數不經擴展地轉換成字符串常量。

要點:

  • 宏定義參數的左右兩邊的空格會被忽略,參數的各個Token之間的多個空格會被轉換成一個空格。
  • 宏定義參數中含有需要特殊含義字符如"或\時,它們前面會自動被加上轉義字符\。

還是通過MSDN上的例子來看看容易懂:

#define F abc 
#define B def 
#define FB(arg) #arg 
#define FB1(arg) FB(arg) 
 
FB(F B) 
FB1(F B) 

初看到時推測這兩行預編譯出來后效果是一樣的,但是看了使用gcc -E編譯出來代碼,這才理解了MSDN上對“不經擴展”有了更深刻的理解,實際的預編譯后代碼為:

"F B"; 
"abc def"; 

推測變換過程應該如下:

FB(F B) --> #F B -->"F B" 
FB1(F B) --> FB1(abc def) --> FB(abc def) --> #abc def --> "abc def" 

標記連接操作(##)
將多個Token連接成一個Token。
要點:

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

來理解一下MSDN上舉的例子:

#include <stdio.h> 
#define paster( n ) printf_s( "token" #n " = %d", token##n ) 
int token9 = 9; 
 
int main() 
{ 
 paster(9); 
} 

paster(9);的預處理步驟應該如下:

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

這樣應該就很好理解了。

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

盈江县| 开阳县| 长沙市| 高要市| 湘潭县| 蛟河市| 藁城市| 古浪县| 濉溪县| 太白县| 东辽县| 德昌县| 景洪市| 绥滨县| 荔浦县| 攀枝花市| 来安县| 中山市| 呈贡县| 新乐市| 辛集市| 怀来县| 类乌齐县| 酒泉市| 新宾| 蓝田县| 项城市| 固始县| 张家口市| 盐山县| 眉山市| 青浦区| 股票| 邵阳县| 海安县| 尼木县| 鄂托克前旗| 余庆县| 桦南县| 于田县| 宿州市|