组织C源文件的好方法?

组织C源文件的好方法?,c,C,我组织C源代码的方式是将结构、宏和函数原型放在头文件中,将函数实现放在.C文件中。然而,我最近阅读了很多其他人为大型项目编写的代码,我开始看到人们经常在C源代码中定义结构和宏之类的东西,就在使用它的函数之上。我可以看到这样做的一些好处,因为您不必到处搜索特定函数使用的结构和宏的定义,所有内容都与使用它的函数大致位于同一位置。但是,我也看到了它的一些缺点,因为这意味着结构/宏定义没有一个中央存储库,因为它们分散在源代码中 我的问题是,与头文件本身相比,在决定何时将宏/结构定义放入C源代码时,有哪些

我组织C源代码的方式是将结构、宏和函数原型放在头文件中,将函数实现放在.C文件中。然而,我最近阅读了很多其他人为大型项目编写的代码,我开始看到人们经常在C源代码中定义结构和宏之类的东西,就在使用它的函数之上。我可以看到这样做的一些好处,因为您不必到处搜索特定函数使用的结构和宏的定义,所有内容都与使用它的函数大致位于同一位置。但是,我也看到了它的一些缺点,因为这意味着结构/宏定义没有一个中央存储库,因为它们分散在源代码中


我的问题是,与头文件本身相比,在决定何时将宏/结构定义放入C源代码时,有哪些好的经验法则

通常,您放在头文件中的所有内容都是接口的一部分,而放在源文件中的所有内容都是实现的一部分

也就是说,如果头文件中的某些内容仅由关联的源文件使用,则它是移动到该源文件的最佳候选对象。这可以防止“污染”每个文件的名称空间,这些文件使用的头包含宏和它们从未打算使用的类型。

  • 定义模块外部接口的内容放在标题中
  • 模块中刚刚使用的内容应该保留在C文件中
  • 头文件应包括支持其声明所需的头文件
  • 标题应该用#ifndef NAME_H包装,以确保每个编译单元包含一个标题
  • 模块应包括其自己的标题,以确保一致性

顺便说一句,很多人都不知道这个基本的东西,这是在任何规模的C项目中保持理智所必需的。

主要是,手头的问题是一种封装考虑。您可以将模块的头文件看作与其说是它的“开销”,不如说是它的公共接口声明,这大概是您正在查看代码的人看到它的方式

从这里可以很自然地看出,头文件中的内容是其他模块需要了解的:预期在外部使用的函数的原型、用于接口的结构和宏、外部变量声明等等,在David Straker(在线提供)的《c风格:标准和指南》一书中,有一些关于文件布局以及c文件和标题之间的划分的好主意

您可以阅读本手册,特别是第7.4章

正如John Calsbeek所说,您可以根据头部分的使用方式来建立您的组织。 如果一个结构、类型、宏。。。只有一个源代码使用,您可以将代码移到那里


您可能有原型的头文件和公共声明(类型定义等)的头文件。

如果您在.c中定义了结构和宏,您将无法从其他.c文件中使用它

为此,必须将其放入.h中,以便#include告诉编译器在何处检查结构和宏


除非您#包括“x.c”,否则您不应该这样做=)

将您的公共结构和接口放入.h文件中

将您的私有位放入.c文件

如果我有多个实现逻辑功能集的.c文件,我会将需要在这些实现文件之间共享的内容放入一个
*p.h
文件(“p”表示私有)。客户端代码不应包含*p.h标头

例如,如果我有一组实现XML解析器的例程,我可能有以下组织:

xmlparser.h    - the public structures, types, enums, and function prototypes

xmlparserp.h   - private types, function prototypes, etc. that client code 
                 doesn't and shouldn't need

xmlparser.c    - implementation of the XML parser
xmlutil.c      - some other implementation bits (would include xmlparserp.h)
这就是一切

接受答案的补充:在头文件中放置不完整的结构声明可能会很有用,但只将定义放在.c文件中。现在,指向该结构的指针将为您提供一个您完全可以控制的私有类型。对于保证关注点的分离非常有用;有点像C++中的私有成员。


有关广泛的示例,请点击链接。

已经讨论过多次。这个例子来自“相关问题”侧栏:imo认为这个问题,或者至少这个问题的答案是非常不同的。顺便说一句,我在发布Q之前做了一次搜索,但没有找到任何能完全回答Q的答案,(但我可能错了)链接的问题似乎更多的是关于如何组织目录结构以正确放置第三方库。我选择了最方便的一个。试试看。所有的都找到了。包括他们自己的头文件也是一个很好的观点——我不敢相信我有多少次会遇到不这样做的代码,结果愚蠢的小差异悄然而至。+1我一直都这样做。这本书有没有pdf格式的下载位置?读得好一点。。。