头文件中不要去定义函数

本文探讨了在C/C++编程中头文件的正确使用方法,解释了为什么不应在头文件中定义函数,而是应该声明函数,并在源文件中定义。讨论了函数重复定义导致的链接错误及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
如果现在在1.h文件中定义一个函数:
#include
using namespace std;

void fun1()
{
    cout<<"fun1()"<<endl;
}

在源文件2.cpp中这样使用:
#include "1.h"
//extern void fun1(); //有没有此申明都不报错
void fun2()
{
    fun1();
}

在源文件3.cpp中这样使用,就会报错了,此时讲提示有重复定义fun1。
#include "1.h"
void fun3()
{
    fun1();
}


原因:
编译器在编译时候的一个编译单元是*.o,在所生成的N个*.o文件中,任何变量或者函数只能有一个定义,否则在链接时候,链接器不知道要使用哪个*.o文件中的定义。所以链接器讲产生重复定义的链接错误。
对于#include,它讲把所包含的头文件内容全部放到源文件里面,所以对于上面2.cpp和3.cpp,编译时候将会类似于:
#include
using namespace std;

void fun1()
{
    cout<<"fun1()"<<endl;
}
void fun2()
{
    fun1();
}

对于3.cpp
#include
using namespace std;

void fun1() //fun1又定义了一次啦,链接肯定要出错咯~
{
    cout<<"fun1()"<<endl;
}
void fun3()
{
    fun1();
}
因而在平常时候,我们不要讲函数定义在头文件中。只在头文件中进行声明,在源文件中实现。这样对于大型工程,有助于代码文件的有效管理。


=============================================

同一个函数、变量可以在不同的c文件中根据需要有多个声明,但只能有一个定义。这就决定了如果在头文件中定义函数或变量,则该头文件只能使用一次,不能被别的c文件使用,也即限制了最好只有一个c文件,因为别的c文件已经不能再使用这些头文件;而头文件的真正用处是实现“接口”,使变量或函数供别的模块调用函数,函数类似“原子”的作用,该功能很多c文件(和头文件?)都会需要用到;而在头文件中定义,则只是起到“插入”的作用,只是方便把不同功能的模块include到不同的文件中。

那么考虑另一中情况:如果我只使用一个c文件用来实现主函数,别的函数或者功能模块都定义在别的头文件中,然后全部include到主函数所在的c文件中,可不可以呢?貌似也比较方便,也是一种模块化编程,缺点就是,模块之间的函数不能共用。如果你保证模块之间的函数不需要共用,就可以;但如果是写类似库文件的“原子函数”,就不能使用这种方法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值