这不能按预期工作:
#define stringify(x) #x
printf("Error at line " stringify(__LINE__));
这有效:
#define stringify1(x) #x
#define stringify(x) stringify1(x)
printf("Error at line " stringify(__LINE__));
预处理用于扩展此类宏的优先级是什么?
最佳答案
扩展宏时,仅当这些参数未经过字符串化(#
)或 token 粘贴(##
)运算符时,预处理器才会扩展该宏的参数。因此,如果您有:
#define stringify(x) #x
stringify(__LINE__)
然后,预处理器不会扩展
__LINE__
,因为它是字符串化运算符的参数。但是,当您这样做时:#define stringify1(x) #x
#define stringify(x) stringify1(x)
stringify(__LINE__)
然后,在扩展
stringify
时,预处理器会将__LINE__
扩展为当前行号,因为x
的定义中既未将stringify
与字符串化运算符又使用了 token 粘贴运算符。然后扩展stringify1
,我们得到了想要的东西。C99标准的相关语言来自§6.10.3.1/1:
第6.10.3.2节和6.10.3.3节分别定义了
#
和##
运算符的行为。关于c - 宏扩展的确切步骤是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6742501/