【发布时间】:2016-12-14 11:44:09
【问题描述】:
我刚刚学习了一个教程,该教程涉及使用 CPP 宏在程序中实现调试系统。宏的一个很好的行为是递归,可以将宏放入另一个宏中,如下所示:
#define MACRO1 "World"
#define MACRO2 printf("Hello %s\n",MACRO1);
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[]){
MACRO2
return 0;
}
输出:Hello World
以下似乎也有效:
#define MACRO2 printf("Hello %s\n",MACRO1);
#define MACRO1 "World"
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[]){
MACRO2
return 0;
}
所以只是为了理解,CPP 是否首先读取所有#define X 以列出已声明的宏,然后替换其他宏中的宏,避免预处理中的“鸡与蛋”问题?
我认为这是有道理的,考虑到预处理是一个一次性的过程(在编译期间),而不是实时发生。因此,在代码中定义宏的位置无关紧要,但实际上是否定义了它。
如果有一个 3000 行的代码,并且只有在最后一行定义代码中使用的宏才有效?
提前谢谢你!
【问题讨论】:
标签: c macros c-preprocessor