C语言编译过程,宏定义与使用分析,条件编译使用分析,#error与#line,#pragma预处理分析,#和##运算符使用解析

编译过程

C语言编译过程,宏定义与使用分析,条件编译使用分析,#error与#line,#pragma预处理分析,#和##运算符使用解析

预处理做了哪些事:

  • 处理所有的注释,以空格代替
  • 将所有的#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

连接器主要做了啥:

  • 主要将各个模块相互引用的地方相互链接,使各个模块能够正确的衔接

C语言编译过程,宏定义与使用分析,条件编译使用分析,#error与#line,#pragma预处理分析,#和##运算符使用解析

静态链接和动态链接对比以及实验结果:
https://blog.csdn.net/zhengnianli/article/details/104321056

总结

  1. 编译器将编译过程分为预处理,编译,汇编
  2. 链接器将各个模块链接为一个可执行文件
  3. 链接分为静态链接和动态链接,静态链接在编译期完成,动态链接在执行期完成

pragma

  • #pragma message 代表一次编译输出信息,和#error #warning代表一些编译出错信息
  • #pragma once代表编译的时候 只编译一次,但是编译器不一定支持
  • #pragma pack指定内存字节对齐数,结构体中的成员大小和pack取较小的一个,成员地址必须能够被对齐参数整除

 

上一篇:Flutter 项目模块化


下一篇:Maven项目命名规范