您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關詳解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
!串。
即p1,p2,p3,p4這四種寫法是等價的,這一點作為之后解釋#
用法的前提。
字符串化操作(#)
當用作字符串化操作時,#
的主要作用是將宏參數不經擴展地轉換成字符串常量。
要點:
還是通過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。
要點:
來理解一下MSDN上舉的例子:
#include <stdio.h> #define paster( n ) printf_s( "token" #n " = %d", token##n ) int token9 = 9; int main() { paster(9); }
paster(9);
的預處理步驟應該如下:
這樣應該就很好理解了。
上述就是小編為大家分享的詳解C++中的#、##和了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。