作者:喜欢猫咪的的程序员
专栏:《C语言》
喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》
目录
程序的翻译环境和执行环境:
在ANSI C的任何一种实现中,存在两个不同的环境。
- 第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。
- 第2种是执行环境,它用于实际执行代码
编译一个C语言程序是一个多阶段的过程。从总体上看,这个过程可以分成四个独立的阶段。预处理、编译、汇编和连接
我们先来看看这4个过程的流程图:
4个过程的介绍:
1.一个文件经过编译器生成对应的目标文件
2.多个目标文件与链接库一起生成链接器,最终生成可执行程序。(编译过程)
编译过程中各个阶段实现的事情:
我们先来了解一下编译过程中各个阶段的操作指令:
1. 预处理 选项 gcc -E test.c -o test.i
预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。
2. 编译 选项 gcc -S test.c
编译完成之后就停下来,结果保存在test.s中。
3. 汇编 gcc -c test.c
汇编完成之后就停下来,结果保存在test.o中。
我们可以通过上述的各个指令来观察各个阶段。
下图是各个阶段会做的事情以及操作指令:
预处理详解:
预定义符号:
这些预定义符号都是语言内置的。
以上预定义符号如何使用呢?
参考下图:
#define :
#define 定义标识符
语法:
#define name stuff
stuff 只要合法都可以,数字 字符串甚至是一串代码
运用如下:
#define 定义宏
宏的申明方式:
#define name( parament-list ) stuff
其中的 parament-list 是一个由逗号隔开的符号表,它们可能出现在stuff中
注意:
参数列表的左括号必须与name紧邻。
如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。
如何运用如下:
宏存在的一些问题:
注意:能加括号尽量加括号,避免出现歧义,造成错误。
避免出现下面这种情况:
#define 替换规则
我们都知道 #define会替换,那他替换有什么原则吗?如下: