C 了解C程序编译的四个阶段
这四个阶段一定要知道!!!
在不了解之前,我使用VS开发c程序调用第三方库时,第三方库的开发文档说明中多次提到配置连接器的附加依赖项,虽跟着操作了一遍,但感觉还是云里雾里。
但如果早早了解了这四个阶段,我应该就会从从容容,游刃有余了。
C程序编译的四个阶段
- 预处理:预处理器处理一些预处理指令,如:
- 对#include指令 包含的头文件的展开
- 对#define指令 进行内容替换
- 对条件编译宏的处理
- 对#pragma 预处理指令的处理等
- 将注释清除
- 编译:编译器将c程序编译成汇编文件
- 汇编:汇编器将汇编代码处理成目标文件
- 链接:链接器将目标文件还有其它库文件处理成可执行文件
着重说下预处理阶段
头文件包含
即#include指令,在预处理阶段会将指定的头文件中的代码插入到使用该指令的文件中。达到在多文件中共享代码的效果。
宏定义
常见的有 #define 指令,它用来定义宏;比如用来定义常量宏、定义函数宏、定义条件编译宏。
条件编译
常见的条件编译指令,#if #elif #endif 搭配条件编译宏,实现一些特殊处理;如:
#define VERSION 1 定义了一个常量宏;然后使用#if (VERSION==1) /*一些逻辑处理*/ #elif (VERSION==2) /*一些逻辑处理*/ #endif
实现根据VERSION宏的值的不同,只让某一段逻辑生效的效果。
还有一对儿条件编译指令,
#ifndef XXX #define XXX /*一些代码逻辑*/ #endif;
这个眼熟吧?对,这对条件编译指令,可以处理头文件被重复包含时带来的负作用。
下面是一些示例代码,帮助了解预处理指令的使用:
#include<stdio.h>
//宏定义一般有 定义常量的宏 定义函数的宏 定义条件编译的宏
//这个属于定义常量宏
#define PI 3.14
//这属于定义函数宏
#define POWER(X) ((X)*(X));
//这属于定义函数宏
#define log(x) printf(""#x" value is %d\n",(x));
//这属于定义条件编译宏
#define DEBUG
//#define RELEASE
#define VERSION 2
void exchange(int a, int b);
//示例:使用条件编译宏
#if (VERSION==1)
void exchange(int a, int b)
{
printf("使用v1版本算法\n");
int tmp = a;
b = a;
a = tmp;
};
#elif (VERSION==2)
void exchange(int a, int b)
{
printf("使用v2版本算法\n");
a = a ^ b;
b = a ^ b;
a = a ^ b;
};
#else
void exchange(int a, int b)
{
printf("此版本未实现此方法\n");
};
#endif
int main() {
// 预处理->处理预处理指令,如:宏、文件包含、条件编译
// 编译->编译器把代码转成汇编语言
// 汇编->汇编器将代码转成目标文件
// 链接->链接器将目标文件和库文件链接生成可执行文件
//示例:使用条件编译宏
#ifdef DEBUG
exchange(1, 2);
#endif
int a = 1;
log(a);
POWER(PI);
return 0;
}
以上便是对,C程序编译的四个阶段的知识点的记录。

浙公网安备 33010602011771号