【问题标题】:C Header Files - Dividing the main codeC 头文件 - 划分主代码
【发布时间】:2017-05-02 18:34:41
【问题描述】:

我正在为学校作业做我的第一个“大/中”项目,我需要将我的代码分成其他一些 c 文件。我的疑问是,最好是有很多文件/头文件,只有几个小代码,还是有更少的文件/头文件和更多的代码/函数?

谢谢!

附言我是新手程序员,请耐心等待,尽量让解释通俗易懂。

【问题讨论】:

  • 看看标准 C 库。不同的标题有不同的大小。有些很小(<stddef.h><stdnoreturn.h><stdbool.h>,...)而有些很大(<stdio.h><stdlib.h><string.h><math.h>,...)。将相关函数的声明组合在一个标题中;将不相关函数的声明分组到单独的头文件中。决定您是选择“每个源文件一个函数”还是“每个源文件多个函数”或“每个源文件多个函数”。都有自己的优点。如果您能拿到 Plauger 的“标准 C 库”(C90)一书,请阅读它。
  • 请注意,这侵犯了关闭 SO 问题的“主要基于意见”的原因。
  • 有一个类似的C++ question here。一些程序员提倡每个文件一个函数,但这对我来说似乎很极端,我按类别对函数进行分组——就像 C 库一样。

标签: c header-files


【解决方案1】:

我的经验是,根据功能将代码分组到源代码/标头中可以提高理解、测试、维护和重用代码的能力。

每个文件中有多少代码实际上取决于封装功能的复杂程度。例如,我有一个源文件,其中包含创建和附加到 WAV 文件的函数。它们相对较小,并且因为它们具有凝聚力,所以我可以在需要创建 WAV 文件的任何项目中使用它们,而不会带来很多其他包袱。其他文件可能很大(或非常大),但如果功能具有凝聚力,我会得到同样的好处。

当我开始这样做时,让我绊倒的一件事是“多次包含”,这是由于在项目中多次包含相同的标头而没有“保护”它。既然您说您是新手,我将添加一个快速示例,说明您可以采取哪些措施来防止它发生。

/**
   @file  my_header.h  
*/

ifndef  MY_HEADER_H // <- Prevents multiple inclusions
#define MY_HEADER_H // <- ...

#ifdef __cplusplus  // <- Allows this to be called from c++
extern "C" {        // <- See "name mangling for more info.
#endif              // <- ...

/**************************/
// your stuff goes here

struct my_struct
{
   // ...
};

// function prototypes, etc.

/**************************/
#ifdef __cplusplus
}
#endif

#endif // MY_HEADER_H

【讨论】:

  • 在 C 中,声明可以重复,只要它们相同。据我了解,标题include guard 是为了防止“标题递归”。实际定义不应在头文件中。
  • @WeatherVane : 是的,“头递归”是更好的描述,并且 [function] 声明、定义等可以重复,只要它们相同。但是如果再次包含该结构,则会导致错误。可以肯定的是,我在 gcc ARM 工具链和 Visual Studio 上进行了尝试。 gcc:错误:重新定义“struct wavfile_header”Visual Studio:错误 C2011“wavfile_header”:“struct”类型重新定义
  • 那是因为struct my_struct { // ... };是变量定义而不是类型声明,不应该在头文件中。
  • 我的理解是结构体定义了一个类型。为了使它成为一个变量声明,您将在下面有另一行 struct my_struct variable_name; 来定义变量。
  • @A.Blodgett 是对的,它是一个结构类型定义,而不是变量声明——它不创建存储。我将它放在标题中,以便其他实体可以声明该类型的变量。这是否属于标题对于这个线程来说是题外话,但是有很多例子,例如 struct timeval in time.h。
猜你喜欢
  • 2021-06-02
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 2012-04-23
  • 2014-02-09
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多