获取宏以进行连接和字符串化

Getting a macro to concat AND stringify

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: warning: pasting ""Hi"" and ""There"" does not give a valid preprocessing token"

尽管(使用 -E 选项)我看到它生成:

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

这对我来说很合适。

任何帮助将不胜感激。

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

#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"