標籤:

請c++大牛幫回答下一個 關於宏的問題?

代碼如下:
#define STR(s) #s

#define XSTR(s) STR(s)

#define CP_VERSION_M 6

#define CP_VERSION_MI 1

#define CP_VERSION_RE 2

const char *cpVersionString = XSTR(CP_VERSION_M)"."XSTR(CP_VERSION_MI)"."XSTR(CP_VERSION_RE);

其中 XSTR(A)"."XSTR(B)"."XSTR(C) ,A,B,C代表常量, "."是什麼符號?作用是什麼?

*cpVersionString 最終是什麼值? 因為很奇怪這個語法在別的版本不報錯,"." 在vs2015會報錯!
報"未找到用戶定義的文本運算符"。。。大家幫幫,謝謝了先


你的代碼在C++11的clang上也編譯不了。

原意是想替換成

"6"".""1"".""2" // = "6.1.2"

在C++98中,

const char *cpVersionString = XSTR(CP_VERSION_M)"."XSTR(CP_VERSION_MI)"."XSTR(CP_VERSION_RE);

這種語法是合法的

但是,在C++11中,字元串可以有了後綴:

OutputType operator "" _suffix(const char * literal_string);
OutputType some_variable = 1234_suffix;

雖然規定了後綴必須以_ 開頭,但是出於保留起見,依舊有非_開頭的後綴的可能性。

這樣預處理器在處理到"."XSTR的時候,就不能像之前一樣認為"."和XSTR是兩個token了,因為XSTR可能是"."的後綴,是一體的

因此C++11中這兩者之間必須要有一個空格

const char *cpVersionString = XSTR(CP_VERSION_M)"." XSTR(CP_VERSION_MI)"." XSTR(CP_VERSION_RE); // 6.1.2


推薦閱讀:

C++ 為什麼 Lambda 的引用捕獲 const 變數會失敗?
做遊戲與搞圖形學有什麼聯繫?
如何評價c++的協程庫libgo?
c++如何在編譯期判斷一個對象是否是字元串字面值?
Visual Studio 提供免費(Community)版會產生什麼影響?

TAG:C | VisualC |