有哪些方法来模块化C代码?

Ari*_*nen 12 c encapsulation namespaces module scoping

您知道在项目规模扩大时模块化C代码有哪些方法,实践和约定?

smc*_*ron 15

创建只包含使用模块所需内容的头文件.在相应的.c文件中,在外部(例如辅助函数)静态创建任何不可见的内容.在外部可见的所有内容的名称上使用前缀,以帮助避免命名空间冲突.(如果一个模块跨越多个文件,事情会变得更难.因为你可能需要暴露内部事物而不能用"静态"隐藏它们)

(如果我要尝试改进C,我要做的一件事是将"静态"作为函数的默认范围.如果你想在外面看到一些东西,你必须用"导出"或"全局"或其他东西标记它类似.)

  • +1.将静态函数用于"私有"行为限制了不必要耦合的可能性. (2认同)
  • 通过将标头用作实现文件中列出的第一个标头,确保标头单独工作.如果这不起作用,标题不完整. (2认同)

j_r*_*ker 10

OO技术可以应用于C代码,它们只需要更多的规则.

  • 使用不透明手柄操作对象.这是如何完成的一个很好的例子是stdio库 - 一切都围绕不透明的FILE*句柄组织.围绕这个原则组织了许多成功的库(例如zlib,apr)
  • 因为structs的所有成员都隐含public在C中,所以你需要一个约定+程序员规则来强制执行有用的信息隐藏技术.选择一个简单的,可自动检查的约定,例如"私人成员以'_'结尾".
  • 可以使用指向函数的指针数组来实现接口.当然,这需要比提供语言支持的C++等语言更多的工作,但它仍然可以用C语言完成.

  • 不透明手柄是一个很好的手柄.虽然结构是公然的公开,但只有你把它们放在标题中.您可以说,在库的用户标题中,例如:[code] struct opaque_foo; extern int my_func(struct opaque_foo*f); [/ code]库的内部代码当然会说明opaque_foo中的内容,但不需要将它暴露给使用该库的代码. (2认同)

Sco*_*ock 0

有目录和文件,但没有命名空间或封装。您可以将每个模块编译为单独的 obj 文件,并将它们链接在一起(作为库)。