这不能按预期工作:

#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/

10-11 04:36