2016-05-16 63 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