一C/C++源代码从最初的文本变为可执行文件主要进行三大步
预编译阶段:主要是编译器执行代码文本处理工作,并不会进行语法检查
主要执行三大类预编译命令
宏定义:代码文本替换功能,将使用了宏的地方采取宏定义方式直接展开
条件编译:代码文本剪切功能,根据设定的条件选择性删除一些代码片段
包含文件: 代码文本插入功能 #include 包含其他头文件,#include其内部实现是将被包含的头文件代码插入到当前代码文本中
首先是宏定义:做文本展开 因此在定义简单逻辑功能宏时,易发生错误
#define PI 3.1415926
#define S(a, b) a * b
int main() {
printf("%lf\n", 2 * PI);
printf("S(3, 4) = %d\n", S(3, 4));
printf("S(3 + 6, 4) = %d\n", S(3 + 6, 4));
int n;
S(int, p) = &n;//可以通过编译 因为宏只是做文本展开 此处为 int*p=&n
printf("__DATE__ = %s\n", __DATE__);//__DATE__是系统定义的宏 由预处理器做解释展开
printf("__TIME__ = %s\n", __TIME__);
printf("__LINE__ = %d\n",
__LINE__);
printf("__FILE__ = %s\n", __FILE__);
return 0;
}
运行结果:
编译阶段:将预编译阶段产生的带编译源码进行语法检查,编译成目标文件(.o类型)
目标文件中存放定义,部分调用使用了其他部分定义的变量和过程,因此还需要第三步:链接
链接阶段主要将各个目标文件定义和被调用处链接起来,最终产生可以直接执行的可执行文件