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

Joh*_*ohn 3 c macros string-concatenation c-preprocessor

在预处理器宏中连接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)
Run Code Online (Sandbox Code Playgroud)

得到警告是不可接受的

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

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

const char* s = "Hi""There";
Run Code Online (Sandbox Code Playgroud)

哪个看起来对我来说.

任何帮助将不胜感激.

小智 6

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

#define TOKENPASTE3(x, y) #x #y
const char* s = TOKENPASTE3(Hi, There);
Run Code Online (Sandbox Code Playgroud)

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

#define STRINGIFY(x) #x
#define TOKENPASTE(x, y) STRINGIFY(x ## y)
Run Code Online (Sandbox Code Playgroud)

成为"HiThere".