如果现在在1.h文件中定义一个函数:
#include
using namespace std;
void fun1()
{
}
在源文件2.cpp中这样使用:
#include "1.h"
//extern void fun1(); //有没有此申明都不报错
void fun2()
{
}
在源文件3.cpp中这样使用,就会报错了,此时讲提示有重复定义fun1。
#include "1.h"
void fun3()
{
}
原因:
编译器在编译时候的一个编译单元是*.o,在所生成的N个*.o文件中,任何变量或者函数只能有一个定义,否则在链接时候,链接器不知道要使用哪个*.o文件中的定义。所以链接器讲产生重复定义的链接错误。
对于#include,它讲把所包含的头文件内容全部放到源文件里面,所以对于上面2.cpp和3.cpp,编译时候将会类似于:
#include
using namespace std;
void fun1()
{
}
void fun2()
{
}
对于3.cpp
#include
using namespace std;
void fun1()
//fun1又定义了一次啦,链接肯定要出错咯~
{
}
void fun3()
{
}
因而在平常时候,我们不要讲函数定义在头文件中。只在头文件中进行声明,在源文件中实现。这样对于大型工程,有助于代码文件的有效管理。
=============================================
=============================================
同一个函数、变量可以在不同的c文件中根据需要有多个声明,但只能有一个定义。这就决定了如果在头文件中定义函数或变量,则该头文件只能使用一次,不能被别的c文件使用,也即限制了最好只有一个c文件,因为别的c文件已经不能再使用这些头文件;而头文件的真正用处是实现“接口”,使变量或函数供别的模块调用函数,函数类似“原子”的作用,该功能很多c文件(和头文件?)都会需要用到;而在头文件中定义,则只是起到“插入”的作用,只是方便把不同功能的模块include到不同的文件中。
那么考虑另一中情况:如果我只使用一个c文件用来实现主函数,别的函数或者功能模块都定义在别的头文件中,然后全部include到主函数所在的c文件中,可不可以呢?貌似也比较方便,也是一种模块化编程,缺点就是,模块之间的函数不能共用。如果你保证模块之间的函数不需要共用,就可以;但如果是写类似库文件的“原子函数”,就不能使用这种方法。