在预处理器宏中用C/C++实现连接的方法是使用α。
字符串化的方法是使用。
我在试着浓缩和串接。这将从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:警告:粘贴”“hi”“和
“there”没有提供有效的预处理标记
尽管(使用-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 - 获取宏以进行合并和字符串化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28456192/