首先说声对不起,我不太会用Markdown编辑器,所以文章乱。
环境:linux操作系统 / X86-64和gcc编译器
================================================
前言:
以C/C++为例,编写好的源代码会包含一些预处理命令(#include和#define),需要经过预处理成为纯C/C++的文本(即以.i为后缀的文件)。
常见的预处理命名如下:
在这个过程中文件有什么变化?
#define 不用多说,宏定义,使得源代码更容易理解。
#include 则是关注的重点,它的目的就是把多个编译单元(也就是c或者cpp文件)公用的内容,单独放在一个文件里减少整体代码尺寸;或者提供跨工程公共代码。
================================================
#include
在linux系统中编写一个简单的源程序命名为:a.c
使用命令:gcc -E -P a.c 查看不含调试信息的预处理结果。大概看一下预处理的结果。
================================================
接下来执行gcc -E a.c 即输出带调试信息的预处理结果【有点乱,但调试信息可以告诉我们内容来自哪里】可以看到,stdio.h 这个文件是在usr/include 路径下的。同时我看到还引入了其他的头文件,比如/usr/include/stdc-predef.h 、/usr/include/features.h、/usr/include/x86_64-linux-gnu/sys/cdefs.h等等。
================================================
按路径打开stdio.h 文件,看看预处理引入了头文件的哪些内容。
在我这个版本里(感觉和网上的不太一样)stdio.h里面还有预处理命令。
暂时认为:预处理根据头文件的预处理命令来把部分类型定义、全局变量及函数原型"复制"到源文件中。而不是直接全搬过去。
理由:
stdio.h里面有的数据类型,在预处理后的文件里不一定有。