读书笔记--预处理、宏定义

1、编译工具链:

  预处理用预处理器,编译用编译器,汇编用汇编器,链接用链接器,这几个工具再加上其他一些额外的会用到的可用工具,合起来叫编译工具链。gcc就是一个编译工具链。

2、预处理的意义
(1)编译器本身的主要目的是编译源代码,将C的源代码转化成.S的汇编代码。编译器聚焦核心功能后,就剥离出了一些非核心的功能到预处理器去了。
(2)预处理器帮编译器做一些编译前的杂事。

 

3、由源码到可执行程序的过程
(1)源码.c->(编译)->elf可执行程序
(2)源码.c->(编译)->目标文件.o->(链接)->elf可执行程序
(3)源码.c->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序
(4)源码.c->(预处理)->预处理过的.i源文件->(编译)->汇编文件.S->(汇编)->目标文件.o->(链接)->elf可执行程序

 

4、编程中常见的预处理

(1)#include(#include <>和#include ""的区别)


(2)注释
(3)#if #elif #endif #ifdef
(4)宏定义

宏定义的解析规则就是:在预处理阶段由预处理器进行替换,这个替换是原封不动的替换。

宏定义被预处理时的现象有:
第一,宏定义语句本身不见了(可见编译器根本就不认识#define,编译器根本不知道还有个宏定义);
第二,typedef重命名语言还在,说明它和宏定义是有本质区别的(说明typedef是由编译器来处理而不是预处理器处理的);

宏定义是在预处理期间处理的,而函数是在编译期间处理的。

宏定义示例2:SEC_PER_YEAR,用宏定义表示一年中有多少秒
#define SEC_PER_YEAR (365*24*60*60UL)
关键:
第一点:当一个数字直接出现在程序中时,它的是类型默认是int
第二点:一年有多少秒,这个数字刚好超过了int类型存储的范围

5、gcc中只预处理不编译的方法

(1)gcc编译时可以给一些参数来做一些设置,譬如gcc xx.c -o xx可以指定可执行程序的名称;譬如gcc xx.c -c -o xx.o可以指定只编译不连接,也可以生成.o的目标文件。
(2)gcc -E xx.c -o xx.i可以实现只预处理不编译。一般情况下没必要只预处理不编译,但有时候这种技巧可以用来帮助我们研究预处理过程,帮助debug程序。

 

posted @ 2021-05-30 22:49  Ben002  阅读(157)  评论(0编辑  收藏  举报