在项目开发中,头文件与源文件分开的具体理解:
例如下面一段程序:
// head1.h中
#ifndef _HEAD1_H
#define _HEAD1_H
int x;
#endif
// head1.cpp中
#include "head1.h"
// main.cpp中
#include "head1.h"
int main() {
x = 1;
return 0;
}
如果命令行输入 : g++ -c *.cpp
会出现 multiple definition of `x’
即重定义, 这是为什么呢,不是已经有条件编译了吗,为什么还会出错呢
首先我们要理解C语言源程序的执行过程 : 预处理 --> 编译 --> 链接 --> 生成可执行文件
首先,条件编译可以解决一次编译过程中出现重复定义的情况,什么是一次编译过程呢,就是说如果main函数包含了多个头文件 “head1.h”, “head2.h” 而 "head2.h"中也导入了 “head1.h”, 如果没有条件编译就会定义两次head1.h中的内容,所以在执行 g++ main.cpp 是不会出现任何错误的
而上面的情况是多了一个 head1.cpp 的源文件,我们要想得到可执行文件首先需要编译每一个文件得到链接文件(.o),然后再链接所以的链接文件 g++ *.o ,这里其实已经可以看出问题了,也就是说编译是分开编译的,有多少个源文件就编译几次,条件编译在两个源文件之间是没有起到作用的,所以链接的时候每个文件都定义了所以的函数和变量,自然就重复定义了。
所以 声明 和 定义 分开就是为了解决上面的问题,声明可以声明很多次,在编译过程中其他文件包含了某个头文件,也只是一直在重复编译某个变量或函数,定义却只是在编译源文件时产生,这样也就不会出现重复定义的情况。
然后给大家一个可能很不熟悉的关键字(我就是不知道这个才写这篇文章的),
c中可以用 extern 来声明变量, 即 extern char a[10][20].
上面的代码解决方法就是把头文件改成这样:
// head1.h 中
// head1.h中
#ifndef _HEAD1_H
#define _HEAD1_H
extern int x;
#endif
然后源文件改成:
// head1.cpp中
#include "head1.h"
int x = 10;