1.编译与链接
编译又分为预处理,编译和汇编三个阶段。
首先源文件test.c进行预处理,包含头文件,define定义符号的替换以及删除注释等操作,然后生成test.i文件。
test.i文件进入编译阶段,把C语言代码转换成汇编代码,然后进行语法分析,词法分析,符号分析以及语义分析等,并转换成test.s文件。
test.s文件进入汇编阶段,把汇编代码转换成二进制指令,并形成符号表,符号表是为了在链接阶段能够跨文件进行函数的查找,并生成test.o文件。
test.o文件在链接阶段会合并段表,符号表的合并和重定位,最后通过链接器和链接库转换成可执行文件test.exe
2.define的用法
2.1定义符号
#define name stuff #define X 20
此时name表示的就是stuff,X表示的就是20,会在预处理阶段完成替换
2.2定义宏
宏的意义有点类似于函数,但宏并不会单独开辟一块空间来计算函数里的内容
#define SQUARE(X) ((X)*(X)) #define ADD(X) ((X)+(X))
这里用括号括起来的意义在于宏只算完成替换,并不是真正意义上的函数,例如当你计算SQUARE(6+1)时,不加括号的结果是6+1*6+1,并不是7*7。当你计算10*ADD(2)时也一样,你想计算的是10*4,而不是10*2+2。所以括号的添加是十分有必要的。
2.3#和##的作用
此时#加其中一个未知数,可以直接表示变换的值或者符号等,而不是一个固定的值。
可以看出##可以连接两个不同的符号合成一个新的符号。



