获取宏以进行连接和字符串化
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"
。
在 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"
。