编译预处理

对源程序编译之前做一些处理,生成扩展C源程序

宏定义

#define

文件包含

#include

条件编译

#if – #else – #endif等

无参宏定义

例如 :#define PI 3.1415926
在编写源程序时,所有的3.1415926都可由PI代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用3.1415926表达式去置换所有的宏名PI,然后再进行编译。gcc -E test.c 来查看预处理替换后的代码。如要终止其作用域可使用**# undef**命令。宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。可用宏定义表示数据类型,使书写方便。例如: #define INTEGER int

带参宏定义

#define M(y) yy+3y
形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体的值。要用它们去代换形参,因此必须作类型说明。

define和typedef区别

宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换,而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。

define和const区别

#define是在编译的预处理阶段起作用,而const是在编译、运行的时候起作用。
#define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。
#define只是进行展开,有多少地方使用,就替换多少次,它定义的宏常量在内存中有若干个备份;const定义的只读变量在程序运行过程中只有一份备份。
const常量可以进行调试的,define是不能进行调试的,因为在预编译阶段就已经替换掉了。

文件包含

C-week(5)-编译

条件编译

C-week(5)-编译
C-week(5)-编译

gcc编译

gcc [选项] 要编译的文件 [选项] [目标文件]

预处理(Pre-processing)
读取C语言源文件,对以“#”开头的语句进行处理
C-week(5)-编译
C-week(5)-编译

编译(Compilation)
对预处理之后输出的文件进行词法分析,试图找出所有不符合语法规则的部份,打印错误或警告。若没有任何语法问题,则将其翻译为功能等价的汇编代码
C-week(5)-编译

汇编(Assembly)
把汇编代码翻译成目标机器代码(二进制文件)
C-week(5)-编译

链接(Linking)
将一个文件中引用的符号(函数、外部变量等)与该符号在另文件中的定义和实现连接起来,从而使有关的目标文件连成一个整体,最终生成可以被操作系统执行的可执行文件
C-week(5)-编译

相关文章: