组织C源文件的好方法?

hor*_*guy 11 c

我总是组织我的C源的方法是将结构,宏和函数原型放在头文件和.c文件中的函数实现中.但是,我最近一直在阅读大量项目的其他人的代码,我开始看到人们经常在C源本身中定义诸如结构和宏之类的东西,紧接在使用它的函数之上.我可以看到一些好处,因为你不必去寻找特定函数使用的结构和宏的定义,一切都在与使用它的函数大致相同的地方.但是我也可以看到它的一些缺点,因为它意味着没有一个用于结构/宏定义的中央存储库,因为它们分散在源代码中.

我的问题是,决定何时将宏/结构定义放在C源代码中而不是头文件本身有什么好的经验法则?

Joh*_*eek 29

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

也就是说,如果头文件中的某些内容仅被关联的源文件使用,则它是移动到该源文件的绝佳选择.这样可以防止"污染"每个使用标头的文件的名称空间以及它们从未打算使用的宏和类型.


Nor*_*sey 12

接口和实现 就是它的全部.

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

有关大量示例,请点击链接.


Mic*_*urr 8

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

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

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

例如,如果我有一组实现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)
Run Code Online (Sandbox Code Playgroud)


pix*_*eat 6

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

很多人不知道这个基本的东西BTW,这是在任何大小的C项目上保持理智所必需的.


Thi*_*hib 5

在David Straker的书“ C样式:标准和指南”(可在此处在线获得)中,有一些关于文件布局以及C文件和标头之间的划分的好主意。

您可以阅读第7章,尤其是第7.4章。

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

您可能有原型的头文件,还有一些通用声明(类型定义等)的头文件。