前言:大家知道一个程序要想执行,需要经过几个步骤:预处理,编译,汇编,链接器,然后生成执行性文件,前面我的一篇文章大概写了编译的过程干了啥,今天写一下,预处理过程做了什么。
=================正文========================
预处理过程如下:
1.头文件展开ps把#include的文件插入到相应位置
2.宏展开ps展开所有的宏,并删除#define
3.条件编译ps条件预编译指令比如:#if,#ifdef,#else
4.删除注释ps // /**/的内容
5.添加行号和文件名标识
6.保留#pragrma命令ps指示编译器完成特定的动作
其实归根到底一句话,就是文本替换 宏命令展开。
正如Linux源码中那样,大量的使用宏定义,条件编译,头文件包含。其实不是没有道理的,使用宏定义在编程的时候方便,程序执行效率高。条件编译的好处是可以更好的兼容各个平台。头文件包含体现了模块化编程的思想。
下面简单写个小程序测试一下预编译效果
上面程序包含头文件,宏定义,预编译,和#pragma通过命令gcc -E test.c > example.i重定向生成.i文件,然后打开预编译代码文件如下所示。
然后输出内容如下:
test.c:22:9: note: #pragma message: test demo
#pragma message("test demo\n")
小伙伴发现没 #pragma message("test demo\n")这个就是编译时指示编译器完成的动作,回去查看代码。
总结:其实预处理比较简单,完成的工作很固定,这篇文章就是简单粗略的分析一下预处理过程,在以后的调试过程很有用。
老九学堂会员出品
作者:快乐的镜子