C-Preprocessor宏命令

C-Pre-Processor macros order

我刚刚学习了一个教程,其中涉及到在程序中执行CPP宏来实现调试系统。宏的一个很好的行为是递归的,这使得将宏放入另一个宏中成为可能,如下所示:

1
2
3
4
5
6
7
8
9
10
#define MACRO1"World"
#define MACRO2 printf("Hello %s
",MACRO1);
#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[]){
    MACRO2
    return 0;
}

输出:Hello World

以下内容似乎也有效:

1
2
3
4
5
6
7
8
9
10
#define MACRO2 printf("Hello %s
",MACRO1);
#define MACRO1"
World"
#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[]){
    MACRO2
    return 0;
}

因此,为了理解,cpp是否首先读取所有#define X以列出声明的宏,然后替换其他宏中的宏,避免预处理中出现"鸡和蛋"问题?

我认为这是有道理的,因为预处理是一个一次性的过程(在编译期间),而不是实时发生的。所以,在代码中,宏的定义在哪里并不重要,但实际上,如果宏被定义了的话。

如果有一个3000行的代码,并且只在最后一行定义代码中使用的宏,那么它是有效的吗?

提前谢谢!


实际上,递归替换只在使用宏时发生,而不是在定义宏时。

所以

1
2
#define MACRO2 printf("Hello %s
",MACRO1);

预处理器只是记住,MACRO2扩展为7个标记printf("Hello %s
"
,MACRO1);。此时,它不关心这些标记中的哪一个是宏。

main的地方

1
MACRO2

预处理器将宏扩展到这七个标记,然后检查标记流是否包含更多可以再次扩展的宏。注意到MACRO1,代之以token "World"。此时,它将再次检查,但不再有用于扩展的宏。

如果在执行#defined之前尝试使用宏,仍然会遇到问题。