编译过程
预处理做了哪些事:
- 处理所有的注释,以空格代替
- 将所有的#define删除,展开所有的宏定义
- 处理条件编译指令#if,#ifdef,#elif,#else,#endif
- 处理#inlude,展开被包含的文件
- 保留编译器需要使用的#pragma指令
预处理指令:gcc -E file.c -o file.o
编译过程主要做了哪些事:
对预处理文件进行一系列的词法分析,语法分析以及语义分析
- 词法分析主要包括关键字,标识符,以及立即数
- 语法分析包括分析语法是否符合规则
- 语义分析在语法的基础上分析表达式是否是否合法
分析结束生成相应的汇编代码文件,编译指令:gcc -S file.o -o file.s
汇编过程主要做了哪些:
- 将汇编指令翻译为对应的机器指令
汇编指令:gcc -c file.s -o file.o
连接器主要做了啥:
- 主要将各个模块相互引用的地方相互链接,使各个模块能够正确的衔接
静态链接和动态链接对比以及实验结果:
https://blog.csdn.net/zhengnianli/article/details/104321056
总结
- 编译器将编译过程分为预处理,编译,汇编
- 链接器将各个模块链接为一个可执行文件
- 链接分为静态链接和动态链接,静态链接在编译期完成,动态链接在执行期完成
pragma
- #pragma message 代表一次编译输出信息,和#error #warning代表一些编译出错信息
- #pragma once代表编译的时候 只编译一次,但是编译器不一定支持
- #pragma pack指定内存字节对齐数,结构体中的成员大小和pack取较小的一个,成员地址必须能够被对齐参数整除