請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"
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)版會產生什麼影響?