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; } |
输出:
以下内容似乎也有效:
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是否首先读取所有
我认为这是有道理的,因为预处理是一个一次性的过程(在编译期间),而不是实时发生的。所以,在代码中,宏的定义在哪里并不重要,但实际上,如果宏被定义了的话。
如果有一个3000行的代码,并且只在最后一行定义代码中使用的宏,那么它是有效的吗?
提前谢谢!
实际上,递归替换只在使用宏时发生,而不是在定义宏时。
所以
1 2 | #define MACRO2 printf("Hello %s ",MACRO1); |
预处理器只是记住,
"
在
1 | MACRO2 |
号
预处理器将宏扩展到这七个标记,然后检查标记流是否包含更多可以再次扩展的宏。注意到
如果在执行