在预处理器宏中用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/

10-10 13:21