文件包含的处理方法
处理时间
文件包含也是以"#"开头来写的(#include ), 那么它就是写给预处理器来看了, 也就是说文件包含是会在编译预处理阶段进行处理的。
处理方法
在预处理阶段,系统自动对#include命令进行处理,具体做法是:降包含文件的内容复制到包含语句(#include )处,得到新的文件,然后再对这个新的文件进行编译。
包含文件的种类
一般情况下文件包含分为两种:包含.c文件 和 包含.h文件。
包含.c文件
包含.c文件和编译多文件程序是不同的。
多文件程序: 是在源文件编译时把多个文件进行编译、连接在一起生成一个可执行文件。
包含.c文件: 按照我们上边的说法则是把多个文件合并为一个文件进行编译。
包含.c文件的缺点:
容易产生"重定义",如果一个工程中有多个文件都同时包含了某一个件,那么这个被包含文件的内容就会被复制到多个文件中去,也就相当于每个包含该文件的文件中都定义被包含文件中的变量和函数,这样在链接时就会产生"重定义"错误。
包含.h文件
把同一类功能写到一个.c文件中,这样可以把他们划为一个模块,另外再对应的写上一个.h文件做它的声明。这样以后再使用这个模块时只需要把这两个文件添加进工程,同时在要使用模块内函数或变量的文件中包含.h文件就可以了,之后将main.c文件和之前写好的.c文件同时编译,就可以生成可执行文件main。
包含.h文件的优点:
预处理时会把.h中的内容复制到包含它的文件中去,而复制的这些内容只是声名,不是定义,所以它被复制再多份也不会出现"重定义"的错误。
总结
- 对应的.c文件中写变量、函数的定义。
- 对应的.h文件中写变量、函数的声明。
- 如果有数据类型的定义 和 宏定义 ,请写的头文件(.h)中。
- 头文件中一定加上#ifndef…#define…#endif之类的防止重包含的语句。
- 模块的.c文件中别忘包含自己的.h文件。