赞
踩
C 程序编译流程:1. 预处理阶段 2. 编译阶段 3. 汇编阶段 4. 链接阶段 5. 运行可执行程序。
如何让编译停在预处理结束的时候呢?用参数 -E
,完整的示例为 : gcc -E -o src/example.i src/example.c
,即:编译 src 目录下的 example.c 文件,在预处理阶段结束后停止,将内容保存到 src 目录下的 example.i 文件中(你甚至可以不用 “.i” 结尾,但这已约定俗成)。
在说什么是预处理之前,先讲讲预处理的好处吧。那就是:合理使用预处理编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。
预处理阶段由预处理程序负责,这个程序会在进行编译的第一遍扫描(词法扫描和语法分析)之前工作。也就是说,预处理不会对语法什么的做分析,总之 “错就错了,我这里都让过”。
所以预处理要搞啥呢?预处理的任务大致有这 4 点:1. 删除注释;2. 插入被 #include
指令包含的文件内容; 3. 定义和替换由 #define
指令定义的符号(也叫宏替换或宏扩展);**4. **条件编译。
预处理需要处理的是预处理部分,而预处理部分由预处理指令构成。C 语言对预处理指令的格式要求为:
接下来就针对性的说说 宏定义 、条件编译 和 文件包含。
C 语言中允许用一个标识符表示一个文本(文本可以是字符串,数字,代码语句),这个标识符称为宏。在预处理时,对程序中所有出现的宏,都用宏定义中的文本替换,这个过程称为宏替换或宏展开。如:
#define PI 3.1415926 // PI 称为宏 // 文本是 浮点数
#define MY_NAME "Jone" // 文本为 字符串
#define GREET printf("hello") // 文本为 代码语句
宏定义由源程序中的宏定义指令(#define
)完成;宏替换由预处理程序自动完成。C 语言中,宏定义分为:无参宏定义 和 带参宏定义。
语法结构:
#define 标识符(宏名) [文本(宏体)]
功能:定义可在程序中使用的宏,宏的内容由文本(宏体)替代。像是下面这段代码:
// example.c
#define WORD "hello, world"
int main()
{
printf("%s", WORD);
}
预处理之后会变成这样:
// example.i
...
int main()
{
printf("%s", "hello, world");
}
可见,预处理部分不见了,WORD 也被宏体取而代之。同时,定义过的宏还可以被取消。取消宏有两种方式,一种是 “缺省宏体”;另一种是用预处理指令 #undef
。
两种方式会得到各自不同的结果:
// example.c #define WORD "hello, world" #define WORD // 缺省宏体 int main() { printf("%s", WORD); } /***************************/ // example.i ... int main() { printf("%s", ); }
// example.c #define WORD "hello, world" #undef WORD // 预处理命令取消 int main() { printf("%s", WORD); } /***************************/ // example.i ... int main() { printf("%s"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。