获取一个宏来连接和字符串化

时间:2015-02-11 13:57:37

标签: c macros c-preprocessor string-concatenation

在预处理器宏中连接 C / C ++的方法是使用##。 stringify的方法是使用#。 我正在尝试连接和字符串化。这是从g ++(3.3.2)

生成警告
#define TOKENPASTE(x, y) x ## y
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)      // concat
#define TOKENPASTE3(x, y) TOKENPASTE(#x, #y)    // concat-stringify (warnings)
const char* s = TOKENPASTE3(Hi, There)

获取警告

是不可接受的
  

“test_utils / test_registration.h:34:38:警告:粘贴”“嗨”“和   “”那里“”没有给出有效的预处理令牌“

虽然(使用-E选项)我看到它生成:

const char* s = "Hi""There";

哪个看起来对我来说。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:5)

预处理器已经连接了相邻的字符串文字。所以你的宏是不必要的。例如:

#define TOKENPASTE3(x, y) #x #y
const char* s = TOKENPASTE3(Hi, There);

变为"Hi" "There"。但是,如果您想坚持使用您的方法,则需要使用额外的间接级别来扩展您的新令牌:

#define STRINGIFY(x) #x
#define TOKENPASTE(x, y) STRINGIFY(x ## y)

变为"HiThere"