C头文件-划分主代码

C头文件-划分主代码,c,header-files,C,Header Files,我正在为学校作业做我的第一个“大/中”项目,我需要将我的代码划分成其他一些c文件。我的疑问是,如果多个文件/头文件只包含少量代码,还是少一些文件/头文件,多一些代码/函数 谢谢大家! p、 我是一个新手程序员,所以要有耐心,尽量使解释易于理解。我的经验是,根据功能将代码分组到源代码/标题中,可以提高理解、测试、维护和重用代码的能力 每个文件中有多少代码实际上取决于封装的功能有多复杂。例如,我有一个源文件,其中包含创建和附加到WAV文件的函数。它们相对较小,而且因为它们具有内聚性,所以我可以在任何

我正在为学校作业做我的第一个“大/中”项目,我需要将我的代码划分成其他一些c文件。我的疑问是,如果多个文件/头文件只包含少量代码,还是少一些文件/头文件,多一些代码/函数

谢谢大家!


p、 我是一个新手程序员,所以要有耐心,尽量使解释易于理解。

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

每个文件中有多少代码实际上取决于封装的功能有多复杂。例如,我有一个源文件,其中包含创建和附加到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
/**
@将我的_头文件归档到.h
*/

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

每个文件中有多少代码实际上取决于封装的功能有多复杂。例如,我有一个源文件,其中包含创建和附加到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
/**
@将我的_头文件归档到.h
*/

如果没有我的标题,请看一下标准C库。不同的头具有不同的大小。有些是小的(
,…),而有些是大的(
,…)。将相关函数的声明组合在一个标题中;将无关函数的声明分组到单独的头中。决定是选择“每个源文件一个函数”还是“每个源文件多个函数”或“每个源文件多个函数”。它们都有各自的优点。如果你能得到Plauger的“标准C库”(C90)的书,读它。注意这是侵犯了“主要基于意见的”理由关闭问题。有一个类似的C++。有些程序员提倡每个文件一个函数,但对我来说这似乎是极端的,我按类别对函数进行分组——就像C库一样。不同的头具有不同的大小。有些是小的(
,…),而有些是大的(
,…)。将相关函数的声明组合在一个标题中;将无关函数的声明分组到单独的头中。决定是选择“每个源文件一个函数”还是“每个源文件多个函数”或“每个源文件多个函数”。它们都有各自的优点。如果你能得到Plauger的“标准C库”(C90)的书,读它。注意这是侵犯了“主要基于意见的”理由关闭问题。有一个类似的C++。有些程序员主张每个文件有一个函数,但对我来说这似乎是极端的,我按类别对函数进行分组——就像C库一样。在C中,声明可以重复,只要它们是相同的。在我的理解中,头是用来防止“头递归”的。实际的定义不应在头文件中。@WeatherVane:True,“头递归”是更好的描述,[function]声明、定义等只要相同就可以重复。但如果再次包含该结构,则会导致错误。为了确定这一点,我在gcc ARM工具链和VisualStudio上进行了尝试。gcc:错误:重新定义'struct wavfile_header'Visual Studio:错误C2011'wavfile_header':'struct'类型重新定义,这是因为
struct my_struct{/…}
是一个变量定义,不是类型声明,不应该出现在头文件中。我的理解是结构定义了一个类型。为了使其成为变量声明,您将在下面的另一行中添加
struct my\u struct variable\u name
有一个变量定义。@a.Blodgett是正确的,它是一个结构类型定义,而不是一个变量声明–它不创建存储。我在标题中有它,所以其他实体可以声明该类型的变量。对于这个线程来说,这是否属于头是一个无关紧要的话题,但是有很多这样的例子,例如time.h中的struct timeval。在C中,声明可以重复,只要它们是相同的。在我的理解中,头是用来防止“头递归”的。实际的定义不应在头文件中。@WeatherVane:True,“头递归”是更好的描述,[function]声明、定义等只要相同就可以重复。但如果再次包含该结构,则会导致错误。为了确定这一点,我在gcc ARM工具链和VisualStudio上进行了尝试。gcc:错误:重新定义“struct wavfile_头”可视化