程序的翻译环境和执行环境
翻译环境
首先一个源文件会通过编译器的编译过程形成目标文件,
其次每个目标文件由链接器捆绑在一起,形成一个单一而完整的可执行文件(.exe),
当然连接器同时也会引入标准C函数库中任何被该程序所用到的函数,而且它可以搜索程序员个人的程序库,将其需要的函数也链接到程序中。
编译本身也有好几个阶段
- 预编译阶段(*.i)(gcc -E) 预处理指令,比如#include头文件的包含,注释的删除,#define的符号替换等都是文本操作。
- 编译(*.s)(gcc -S)把C语言转换为汇编语言 主要进行语法分析、词法分析、语义分析、符号汇总(全局变量)。
- 汇编(生成可重定位目标文件*.o)主要是形成符号表,汇编指令->二进制指令----->test.o------>sum.o
- 链接 主要是合并段表、符号表的合并和符号表重定位。
其实总结一下,就是隔离编译,一起链接。
预处理
预定义符号
__FILE__ //进行编译的源文件
__LINE__ //文件当前的行号
__DATE__ //文件被编译的日期
__TIME__ //文件被编译的时间
__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义 。事实上,Linux是遵循的,但是vs不遵循。
#define 定义标识符
在预处理的时候就替换,后面不需要加“ ; ” 否则可能出现问题。
如:
#define MAX 100;
if(condition)
max = MAX;
else
max = 0;
这会出现什么情况呢?
如果你把它放到vs里编译一下,那么它就会告诉你“没有匹配if的非法else” ,那是因为它在预处理替换时,会把MAX替换为100;这样if 后面就跟了两句话,而if 并没有加{},从而导致没有和if匹配的非法else。
未完。。。