为什么这些代码块会产生不同的结果?
一些常用代码:
#define PART1PART2 works
#define STRINGAFY0(s) #s
#define STRINGAFY1(s) STRINGAFY0(s)
情况1:
#define GLUE(a,b,c) a##b##c
STRINGAFY1(GLUE(PART1,PART2,*))
//yields
"PART1PART2*"
案例2:
#define GLUE(a,b) a##b##*
STRINGAFY1(GLUE(PART1,PART2))
//yields
"works*"
案例3:
#define GLUE(a,b) a##b
STRINGAFY1(GLUE(PART1,PART2*))
//yields
"PART1PART2*"
我正在使用来自 VS.net 2005 sp1 的 MSVC++
编辑:目前我认为,扩展宏时预处理器的工作方式如下: 步骤 1: - 获取正文 - 删除 ## 运算符周围的任何空格 - 解析字符串,以防找到与名称匹配的标识符一个参数: - 如果它在 ## 运算符旁边,则将标识符替换为参数的字面值(即传入的字符串) - 如果它不在 ## 运算符旁边,则在首先是参数的值,然后用该结果替换标识符。(忽略 stringafy 单个 '#' 大小写 atm)-删除所有 ## 运算符
第 2 步: - 获取结果字符串并解析它以获取任何宏
现在,我相信所有 3 种情况都应该产生完全相同的结果字符串:
第 1 部分第 2 部分*
因此在第 2 步之后,应该会导致
作品*
但至少应该导致同样的事情。