打印
[经验分享]

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

[复制链接]
1669|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
uptown|  楼主 | 2025-2-20 01:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大部分C编程爱好者都知道,在我们的.h文件里面经常看到的是函数的声明、变量的声明、以及各种各样的宏等等,而且在我前面的文章中我也提到过C语言的模块化设计中常常说到对应的.h和.c文件认为是一个对象,那么.h文件主要是对外的一些接口,一些私有的数据等等实现都会封装在我们的.c中,如果更加形象一点的说明我们的.h,就相当于文章下面的推荐文章链接组成的框,点进去就到了对应的具体文章,具体的文章也就是我们的.c文件了。
    这里再回到我们的程序中来,如下代码所示:

  • #include <stdio.h>
  • #include <stdlib.h>

  • int sAdd(int a,int b);
  • int sSub(int a,int b);
  • //...

  • int main(int argc, char *argv[]) {

  •     printf("Add:  %d\n",sAdd(1 , 1));
  •     printf("Sub:  %d\n",sSub(1 , 1));
  •     return 0;
  • }

  • /***************************************
  • * Fuction:sAdd
  • ***************************************/
  • int sAdd(int a,int b)
  • {
  •     return (a + b);
  • }

  • /***************************************
  • * Fuction:sSub
  • ***************************************/
  • int sSub(int a,int b)
  • {
  •     return (a - b);
  • }
  • //...


    解析一下: 上面是大部分小伙伴最开始学习编程的时候做法,那么我们把main函数前面的声明放到一个对应的.h文件,加法与减法的具体实现放到对应的.c文件,然后再main函数前面用#include "xxx.h",便可以了。简单点说.h完全可以直接在#include处进行展开以便于我们理解分析。


3、头文件中定义函数或者变量
    代码阅读量比较多的小伙伴应该见过直接在头文件里面定义函数或者变量的做法,那么这里我们直接对上面进行改造,得到如下代码:
  • //Filename: main.c
  • #include <stdio.h>
  • #include <stdlib.h>

  • #include "Add.h"

  • int main(int argc, char *argv[]) {

  •     printf("Add:  %d\n",sAdd(global_Var1 , global_Var2));
  •     printf("Sub:  %d\n",sSub(global_Var1 , global_Var2));
  •     printf("公众号:最后一个bug\n");
  •     return 0;
  • }

  • //Filename : Add.h
  • /***************************************
  • * Fuction:sAdd
  • ***************************************/
  • int global_Var1 = 2;
  • int global_Var2 = 2;

  • /***************************************
  • * Fuction:sAdd
  • ***************************************/
  • int sAdd(int a,int b)
  • {
  •     return (a + b);
  • }

  • /***************************************
  • * Fuction:sSub
  • ***************************************/
  • int sSub(int a,int b)
  • {
  •     return (a - b);
  • }

    解析一下:上面的程序也能够成功编译并运行,并且能够获得正确的结果,这也进一步证明直接展开#include "xxx.h"是可以解释得通的。

使用特权

评论回复
沙发
大大财迷| | 2025-2-24 12:45 | 只看该作者
编程规范:引用头文件内,放函数的声明、变量的声明、以及各种各样的宏!
所有的变量定义都放在源文件.c里面!另外,建议多使用局部变量,减少全局变量的使用量!

使用特权

评论回复
板凳
benjaminka| | 2025-3-10 09:47 | 只看该作者
头文件会被多个源文件(.c)包含。如果在头文件中定义函数或全局变量,每个包含该头文件的源文件都会生成一份独立的定义,导致链接器报错

使用特权

评论回复
地板
primojones| | 2025-3-10 10:35 | 只看该作者
每个源文件(.c)独立编译为对象文件(.o)。若头文件中包含函数定义,每个对象文件都会包含该函数的副本。

使用特权

评论回复
5
youtome| | 2025-3-12 16:38 | 只看该作者
当多个源文件(.c)包含同一个头文件时,头文件中的函数或变量定义会被多次复制到每个源文件中。这会导致编译器在链接阶段报告重复定义错误。

使用特权

评论回复
6
wilhelmina2| | 2025-3-12 18:48 | 只看该作者
在头文件中定义全局变量会导致多个源文件中出现相同的全局变量,这不仅浪费内存,还会导致不可预测的行为。

使用特权

评论回复
7
abotomson| | 2025-3-12 20:29 | 只看该作者
如果在头文件中定义非静态的全局变量(如 int global_var;),它会被所有包含该头文件的源文件视为同一个变量,导致重复定义错误。

使用特权

评论回复
8
wwppd| | 2025-3-12 21:03 | 只看该作者
如果多个库或模块在头文件中定义函数或变量,而没有适当的命名空间或前缀约定,很容易发生命名冲突。通过将定义放在源文件中,并通过头文件提供唯一的接口,可以减少这种冲突的可能性。

使用特权

评论回复
9
wilhelmina2| | 2025-3-14 13:36 | 只看该作者
在头文件中定义函数或变量会导致每次这些定义发生变化时,包含该头文件的所有源文件都需要重新编译,这会降低编译效率。

使用特权

评论回复
10
cashrwood| | 2025-3-14 16:18 | 只看该作者
头文件应该提供接口,即函数声明,而不是实现。这样,用户只需关心如何使用函数,而不必关心函数是如何实现的。这有助于封装和抽象,使得代码更易于维护和理解。

使用特权

评论回复
11
robincotton| | 2025-3-14 17:25 | 只看该作者
如果头文件中直接定义全局变量或函数,当多个源文件(.c文件)包含该头文件时,每个源文件都会生成一份独立的定义。

使用特权

评论回复
12
qiufengsd| | 2025-3-14 23:54 | 只看该作者
头文件中声明:用 extern 声明变量。
源文件中定义:在唯一的源文件中分配内存。

使用特权

评论回复
13
benjaminka| | 2025-3-15 11:38 | 只看该作者
头文件通常用于声明函数和变量,而具体的实现放在对应的源文件(.c)中。这种分离有助于模块化设计,提高代码的可维护性和可读性。

使用特权

评论回复
14
beacherblack| | 2025-3-15 12:03 | 只看该作者
每个源文件(.c)独立编译为对象文件(.o)。若头文件中包含函数定义,每个对象文件都会包含该函数的副本。

使用特权

评论回复
15
robertesth| | 2025-3-15 12:33 | 只看该作者
通过将接口(声明)与实现(定义)分离,C 语言实现了代码的高内聚、低耦合,同时兼容多源文件的协作开发。

使用特权

评论回复
16
sesefadou| | 2025-3-15 12:47 | 只看该作者
如果在头文件中定义了大量的函数或变量,每次包含该头文件的源文件都需要重新编译这些定义,这会增加编译时间。

使用特权

评论回复
17
fengm| | 2025-3-15 13:10 | 只看该作者
头文件应仅描述模块的接口,而非实现细节。在头文件中定义函数或变量会暴露内部实现,增加代码耦合性。

使用特权

评论回复
18
usysm| | 2025-3-15 14:35 | 只看该作者
头文件中的定义会直接进入全局命名空间,这可能导致命名冲突,尤其是在大型项目中。

使用特权

评论回复
19
alvpeg| | 2025-3-15 15:05 | 只看该作者
头文件的主要作用是声明接口,让其他源文件知道有哪些函数、变量和类型可以使用,而函数和变量的具体实现应该在源文件中。这样可以清晰地划分代码的接口和实现部分,便于代码的组织和管理。当需要修改函数或变量的实现时,只需要在对应的源文件中进行修改,而不需要在所有包含该头文件的地方都进行修改。

使用特权

评论回复
20
lihuami| | 2025-3-15 15:23 | 只看该作者
如果函数或变量在头文件中定义,每次包含该头文件的源文件都会被编译器处理这些定义,这可能增加编译时间和内存占用。通过仅在源文件中定义,可以减少不必要的编译负担。

使用特权

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

本版积分规则

50

主题

3626

帖子

2

粉丝