发新帖我要提问
12
返回列表
打印
[经验分享]

C语言为什么一般不在.h中定义函数或者变量?(

[复制链接]
楼主: uptown
手机看帖
扫描二维码
随时随地手机跟帖
21
vivilyly| | 2025-3-15 16:53 | 只看该作者 回帖奖励 |倒序浏览
如果多个源文件都包含同一个头文件,且头文件中有函数定义,那么在链接时会因为同一函数被多次定义而导致链接错误。例如,两个不同的源文件都包含了同一个定义了函数的头文件,编译器在编译每个源文件时都会生成该函数的代码,链接器在链接时就会发现冲突。

使用特权

评论回复
22
mollylawrence| | 2025-3-15 18:58 | 只看该作者
即使使用条件编译(如 #ifndef、#define、#endif),也无法避免不同源文件中定义相同符号的问题,因为每个源文件在编译时都会独立处理头文件中的定义。

使用特权

评论回复
23
mnynt121| | 2025-3-15 19:57 | 只看该作者
将定义和声明分开可以使代码组织更加清晰。头文件通常包含接口声明、宏定义、类型定义等,而源文件则包含具体的实现细节。这种分离有助于开发者快速理解代码的结构和功能。

使用特权

评论回复
24
averyleigh| | 2025-3-15 21:00 | 只看该作者
使用 static 关键字可以在头文件中定义静态变量,但这会使每个源文件都有一个独立的副本,增加内存开销。

使用特权

评论回复
25
pl202| | 2025-3-15 21:54 | 只看该作者
头文件的核心目的是 声明接口(如函数原型、全局变量的声明、宏定义、结构体定义等),而非实现细节。

使用特权

评论回复
26
jimmhu| | 2025-3-15 22:34 | 只看该作者
如果一个头文件包含了函数或变量的定义,当多个源文件(.c文件)包含这个头文件时,会导致这些函数或变量在多个源文件中重复定义,从而引发编译错误。

使用特权

评论回复
27
hearstnorman323| | 2025-3-15 22:58 | 只看该作者
不在头文件中定义函数或全局变量的核心原因是 ​避免重复定义​ 和 ​模块化设计。

使用特权

评论回复
28
mmbs| | 2025-3-16 11:29 | 只看该作者
在C语言中,不建议在头文件中定义函数或变量,主要是为了避免重复定义错误、管理全局变量、实现模块化设计、提高编译效率和遵循编码规范。

使用特权

评论回复
29
maudlu| | 2025-3-16 11:46 | 只看该作者
如果在头文件中定义了函数或变量,当头文件发生变化时,所有包含该头文件的源文件都需要重新编译。而如果只是声明,只有在实际使用到这些声明的源文件中发生变化时,才需要重新编译该源文件,减少了不必要的编译工作,提高了编译效率。

使用特权

评论回复
30
backlugin| | 2025-3-16 12:13 | 只看该作者
如果函数或变量仅在当前源文件中使用,可以将其声明为 static,并在源文件中定义。

使用特权

评论回复
31
youtome| | 2025-3-16 12:25 | 只看该作者
将声明和定义分开可以避免代码混淆,使得其他开发者更容易理解和维护代码。

使用特权

评论回复
32
jtracy3| | 2025-3-16 13:35 | 只看该作者
在头文件中应该只包含函数、变量和宏的声明,而不是定义。例如,对于函数,只提供函数原型。

使用特权

评论回复
33
ingramward| | 2025-3-16 14:33 | 只看该作者
通过在头文件中声明函数和变量,并使用适当的访问修饰符(如static),可以控制它们的可见性和访问范围。例如,使用static关键字声明的函数或变量只能在定义它们的源文件中访问,这有助于封装和保护内部实现细节。

使用特权

评论回复
34
sdlls| | 2025-3-16 15:42 | 只看该作者
如果函数或变量在头文件中定义,而该头文件被多个源文件包含,那么每个源文件都会有一个该函数或变量的副本,这会导致链接时的多重定义错误。通过仅在头文件中声明,并在单个源文件中定义,可以避免这个问题。

使用特权

评论回复
35
updownq| | 2025-3-18 19:02 | 只看该作者
如果头文件中定义全局变量,每个包含该头文件的源文件都会生成独立的变量副本,导致内存重复占用

使用特权

评论回复
36
jimmhu| | 2025-3-18 20:00 | 只看该作者
如果需要在头文件中提供小的函数实现,可以使用宏或者内联(inline)函数,但需要注意宏的使用可能会带来一些其他问题,如类型安全和作用域。

使用特权

评论回复
37
saservice| | 2025-3-18 20:58 | 只看该作者
头文件可以看作是模块的接口,而源文件则是实现。这种方式使得其他模块只需要知道接口,而不必关心具体的实现细节。

使用特权

评论回复
38
febgxu| | 2025-3-18 21:59 | 只看该作者
将函数和变量的定义放在源文件中,声明放在头文件中,有助于实现模块化设计。每个源文件可以独立编译,而头文件提供了模块之间的接口。这有助于代码的维护和重用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则