什么方法有模块化的C代码?(What methods are there to modularize

2019-07-30 13:58发布

你知道作为一个项目的发展规模,以模块化的C代码什么方法,实践和惯例?

Answer 1:

创建仅包含什么必要使用一个模块的头文件。 在相应的.c文件(S),做任何事情,并不意味着是可见的外部(例如辅助功能)静态的。 使用一切外部可见的名字前缀,以避免命名空间冲突。 (如果一个模块跨越多个文件,事情变得更加困难,因为你可能需要公开内部的事情,不能掩盖他们与“静态”)

(如果我尝试改善C,有一件事我会做的是使“静态”的函数的默认作用域。如果你想之外的东西看得见,你必须与“出口”或“全球”或东西将其标记类似。)



Answer 2:

面向对象的技术可以应用到C代码,他们只是需要更多的纪律。

  • 使用不透明的句柄对象进行操作。 这是如何实现的一个很好的例子就是stdio库-一切围绕不透明组织FILE*句柄。 许多成功的图书馆围绕这一原则组织(如zlib的 , 四月 )
  • 由于所有成员struct s为隐public在C,你需要一个惯例+程序员纪律来执行信息隐藏的有用的技术。 举一个简单的,自动辨认的约定,如“私有成员结尾‘_’”。
  • 接口可以使用指针阵列来的功能来实现。 当然,这需要比在像C ++语言提供的语言支持更多的工作,但它仍然可以用C语言来完成


Answer 3:

在高和低C级文章包含了很多很好的建议。 特别是,一起来看看在“ 类和对象 ”一节。

规范和风格在ANSI C编码还含有很好的建议,其中你可以挑选。



Answer 4:

  1. 不要定义在头文件中的变量; 相反,定义源文件中的变量和在头添加一个extern声明(声明)。 这将扎入#2,#3。
  2. 使用包含在每一个头文件保护。 这将节省这么多的麻烦。
  3. 假设你已经做了#1和#2,包括你需要(但只有你所需要的),用于在该文件中某个文件的一切。 不要依赖编译器是如何扩展您的include指令的顺序。


Answer 5:

是洋泾浜(以前的Gaim)使用的方法是他们创造了一个Plugin结构。 每个插件填充具有回调初始化和拆除一个结构,与一群的其他描述性信息。 除了结构几乎一切都被声明为静态的,所以只有插件结构暴露的链接。

然后,处理插件与应用程序的其余部分通信的松散耦合(因为它会是不错的,如果它没有安装和拆卸之间的事情),他们有一个信号系统。 插件可以注册回调时特定信号(未标准C信号,但是一个定制的可扩展类[由字符串标识的,而不是代码集])由应用程序的任何部分(包括另一个插件)发出调用。 他们还可以发出信号本身。

这似乎在实践中很好地工作 - 不同的插件可以建立在对方,但耦合是相当宽松 - 的功能没有直接调用,一切都通过信令制度的几点。



Answer 6:

函数应该做的一两件事,做这一件事情。

通过大包装函数使用的小功能的大量帮助,从小型,结构简单的代码来了解(和测试!)积木。

一对夫妇的每个功能创建小模块。 只会暴露你必须保持模块的任何其他静态内。 链接小模块,以及它们的.h接口文件一起。

访问静态文件范围变量的模块中提供getter和setter函数。 这样一来,变量实际上只在一个地方写入。 这有助于跟踪也访问使用该函数中的断点和调用堆栈这些静态变量。

当设计模块化的代码是一个重要的规则:不要试图优化,除非你要。 小很多的功能通常产生清洁,结构良好的代码和附加函数调用的开销可能是值得的。

我总是尽量保持变量在其范围最窄,也是内的功能。 例如,对于循环的指标通常可以保持在块范围,并不需要在整个功能级别被曝光。 C是不是C作为灵活++与但它是可行的“您使用它定义它”。



Answer 7:

破译密码成相关函数库是保持组织的事情的一种方式。 为了避免名称冲突,您还可以使用前缀来让你重用函数名,虽然具有良好的名字,我从来没有真正发现这是太大的问题。 例如,如果你想开发自己的数学程序,但仍然使用一些从标准数学库,你可以用一些字符串前缀你:xyz_sin(),xyz_cos()。

一般来说,我喜欢每个文件和每个源文件约定一个头文件中的一个函数(或一组紧密相关的功能)。 打破文件到目录,其中每个目录代表一个单独的图书馆也是一个不错的主意。 通常你不得不makefile文件系统或构建文件,将允许你建立代表各种库/程序层级以下的整个系统的全部或部分。



Answer 8:

有目录和文件,但没有命名空间或封装。 你可以编译每个模块单独OBJ文件,并把它们连接在一起(如图书馆)。



文章来源: What methods are there to modularize C code?