2016-05-16 64 views
1

下面是代碼:麻煩預處理 - 串聯時,「名」和「=」作爲令牌

#define STR_CONCAT_IMPL(s1, s2) s1##s2 
#define STR_CONCAT(s1, s2) STR_CONCAT_IMPL(s1, s2) 
#define TOSTR_IMPL(x) #x 
#define TOSTR(x) TOSTR_IMPL(x) 
#define STR_CONCAT_TOSTR(s1, s2) TOSTR(STR_CONCAT(s1, s2)) 

int main() { 
    const char* a = STR_CONCAT_TOSTR(name, p); // works 
    const char* b = STR_CONCAT_TOSTR(name, =); // doesn't work 
    return 0; 
} 

我需要從"name"在編譯時像"name="字符串時(runtime拼接不是一種選擇),所以我試圖用我的舊宏,但我得到這個錯誤:

error: pasting "name" and "=" does not give a valid preprocessing token 

但是,當不使用=但一個正常的字符 - 它的工作原理。

我該如何得到這個工作?

需要C++ 98 GCC/MSVC解決方案。

回答

5

我假設你需要一個宏,並且不能僅僅使用編譯器本身。相鄰的字符串文字

利用被級聯:

#define STR_CONCAT_TOSTR(s1, s2) TOSTR(s1) TOSTR(s2) 

在這種情況下,STR_CONCAT_TOSTR(name, =)擴展到"name" "=",該編譯器變成"name="

1

這是因爲name=不是一個令牌,而是兩個。因此,與namep不同,它們不能被粘貼以產生單個令牌。

所有你需要做的就是定義STR_CONCAT_TOSTR不同來連接,而不是試圖串連第一令牌啓動令牌的字符串文字:

#define STR_CONCAT_TOSTR(s1, s2) (TOSTR(s1) TOSTR(s2)) 
+0

我承認你的頭像 - 在github史詩併發的東西! – onqtam

+0

哈哈,謝謝:-) – Cameron