在预处理器宏中连接 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";
哪个看起来对我来说。
任何帮助将不胜感激。
答案 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"
。