我阅读了以下代码:
#define MACRO(abc, def) {#def ## #abc}
char result[10] = MACRO(abc, def);
我知道
##
运算符用于将两个字符串合并为一个,但是 #
和 def
前面的 abc
呢?
来自标准(强调我的):
16.3.2 # 运算符 [cpp.stringize]
2/ 字符串文字是没有前缀的字符串文字。 如果在替换列表中,参数前面紧跟着 # 预处理标记,则两者都将替换为单个字符串文字 预处理标记,其中包含相应参数的预处理标记序列的拼写。 [...]
它将
#
之后的标记“字符串化”。
示例:
#define STRINGIFY(x) #x
STRINGIFY(foo) // will be replaced by "foo"
数字符号或“字符串化”运算符 (#) 将宏参数转换为字符串文字,而不扩展参数定义。它仅与带有参数的宏一起使用。如果它位于宏定义中的形式参数之前,则宏调用传递的实际参数将括在引号中并被视为字符串文字。
那么,
char result[10] = MACRO(abc, def);
将扩展为:
char result[10] = "def" ## "abc";
这将扩展到:
char result[10] = "defabc";
对于那些说它不起作用/无法编译的人:我在 MS VS2010 中测试并运行了它