C中的源文件和头文件之间有什么根本区别?

Del*_*ani 40 c

我不太明白应该如何在C的源文件和头文件中分离.我经常看到许多项目有两组具有相同名称的文件(没有表示源文件和头文件的扩展名).

到目前为止,由于缺乏理解,当我编写库时,我已将所有类和类方法代码放入一个文件中,并且选择文件扩展名时犹豫不决.

什么应该在标题中以及源文件中应该包含哪些内容?我该如何实现这种分离?

Tho*_*mas 63

没有技术差异.如果您愿意,编译器很乐意让您包含.c文件或.h直接编译文件.

然而,存在巨大的文化差异:

  • 声明(原型)进入.h文件.该.h文件是相应文件中实现的任何接口.c.

  • 定义放在.c文件中.它们实现了.h文件中指定的接口.

不同之处在于.h文件可以(通常会)#include进入多个编译单元(.c文件).如果在文件中定义函数.h,它将以多个.o文件结束,并且链接器将抱怨多重定义的符号.这就是为什么定义不应该放在.h文件中.(内联函数是例外.)

如果在.c文件中定义了一个函数,并且您想要从其他.c文件中使用它,则需要在每个其他.c文件中提供该函数的声明.这就是你把声明放在a中的原因.h,以及#include每个声明中的声明.您还可以在每个.c文件中重复声明,但这会导致大量代码重复和无法更改的混乱.

如果一个函数在定义.c文件,但你不希望从其他使用它.c的文件,没有必要宣布它的头.它本质上是该.c文件的实现细节.在这种情况下,也要使用该函数static,因此它不会与其他文件中具有相同名称的函数冲突.


dir*_*tly 14

什么应该在标题中以及源文件中应该包含哪些内容?

通常,标头包含以下一项或多项:

  • 函数声明(静态除外)
  • 变量声明(通常是全局的)
  • 用户定义的类型声明(读struct,union等)
  • 宏定义

另一方面,源文件有:

  • 功能/变量定义
  • 静态函数声明和定义(您不希望将这些公开给客户)
  • 变量定义
  • 有些人更喜欢在标题中定义内联函数(C99)

我该如何实现这种分离?

One Definition Rule是你的朋友.

请记住,如果您正在编写库,那么这就是您的客户可以看到的内容.因此,请提供帮助,并提供可供他们使用您的图书馆的所有信息.源文件通常以二进制形式编译和提供.

顺便说一句,C没有类的概念.

  • 如果"一个定义规则"是金色的,"不要告诉"是银色的.我的意思是不要将私有细节放在头文件中.如果您创建了第三方库,那么您在头文件中放置的所有内容将来都必须支持.如果您在大型项目中工作,最小化头文件会促进重构,因为当您确实需要更改头文件时,它将减少编译时间.(如果您更改了中央头文件,我已经进入了一个需要12个小时才能重新编译的项目.12hoursx#numberofdevelopers = money.) (3认同)