程序环境和预处理
- 程序的翻译环境
- 程序的执行环境
- 详解:C语言程序的编译+链接预定义符号介绍
- 预处理指令#define
- 宏和函数的对比
- 预处理操作符#和##的介绍
- 命令定义
- 预处理指令#include
- 预处理指令#undef
- 条件编译
程序的翻译环境
在ANSI C的任何一种实现中,存在两个不同的环境。
第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。
注意:机器指令也就是二进制识别
第2种是执行环境,它用于实际执行代码。
在企业中一个项目组有多名成员完成项目,各写各的.c文件最后通过编译器和连接器完成
我们的项目;
每一个源文件都需要通过编译器翻译成目标文件.obj;所有的.obj文件和链接库共同协作
生成可执行程序.exe
编译器-cl.exe;链接器-link.exe;
组成一个程序的每个源文件通过编译过程分别转换成目标代码(objec code)。每个目标文件由链接器 捆绑在一起,形咸一个单一而完整的可执行程序。
链接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序
编译过程包含三个部分:预编译,编译,汇编;
我们的vs编译器属于集成开发环境,我们在编译时看不到具体细节
在gcc环境下可以了解编译的细节处理
预处理
gcc test.c -E(预处理指令) -o(输出) test.i(预处理后生成的文件)
1.头文件的包含
#include包含于程序test.c中预处理文件test.i中将头文件中的内容调出来;
2.define定义符号的替换删除定义的符号
3.注释删除
注释是写给程序员看的,编译器对语法规则了如指掌,预处理会删除注释内容;
4.预处理阶段是对文本进行操作;
编译
gcc test. i -S(gcc环境下对test.i文件进行编译处理就结束)
生成了test.s
把C语言代码转化成汇编代码
语法分析
词法分析
符号汇总(符号汇总只统计全局符号,函数中的局部变量不会统计)
语义分析
汇编
gcc test. s -c
生成了test. o(目标文件)
把汇编代码转换成二进制指令
形成符号表
在编译阶段进行符号汇总后,在汇编阶段对这些符号编号地址;