为什么在宏扩展之前进行令牌替换?



考虑以下代码片段:

#include <stdio.h>
#define MY_MACRO(
arg) 
arg
#define MY_MACRO2(t1, t2) t1##t2
#define MY_ a
#define MACRO b
int main() {
printf("%dn", MY_MACRO2(MY_,MACRO)(45));
return 0;
}

结果是编译并显示45,然而,如果MY_MACRO在替换之前展开,则该代码不应该编译。我注意到这一点的原因是当我在C标准中阅读以下内容时:

6.10.3.1(但也在c++标准中)

在识别了类函数宏调用的参数之后,将进行参数替换。替换列表中的参数,除非前面有#或#预处理令牌或后面有##预处理令牌(见下文),否则在其中包含的所有宏都被展开后,将被相应的参数替换. 在被替换之前,每个参数的预处理标记被完全宏替换,就好像它们构成了预处理文件的其余部分一样;没有其他预处理令牌可用

如果参数中包含的所有宏在替换之前都被展开了,为什么我们不以ab(45)结束呢?

X(X())这样的结构工作。注意,当X()被扩展时,X宏被禁用以避免无限递归。在展开宏之前展开参数让我们在参数中使用X。X(X()):

的实际应用
#define TEN(x) x x x x x x x x x x
#define HUNDRED(x) TEN(TEN(x))

最新更新