2010-04-28 69 views
13

C显示其年龄的一个方面是代码的封装。许多现代语言都有类,名称空间,程序包......组织代码要比简单的“包含”方便得多。克服大型项目的C限制

由于C仍然是许多大型项目的主要语言。你如何克服其局限性?

我想一个主要因素应该是很多纪律。我想知道你如何处理大量的C代码,你可以推荐哪些作者或书籍。

+0

一个类似的帖子,不是专门为C,但包含良好的一般建议:http://stackoverflow.com/questions/2025733/coding-pratice-what-are-your-thoughts-on-a-1-7-百万loc项目 – 2010-04-28 19:38:21

回答

18
  • 将代码分离为功能单元。
  • 将这些单元的代码构建到单独的库中。
  • 使用库中的隐藏符号来减少名称空间冲突。

想想开源代码。 Linux内核,GNU C库,X Window系统和Gnome桌面项目中都有大量的C代码。但是,这一切都在一起工作。这是因为大部分代码没有看到任何其他代码。它只通过定义良好的接口进行通信。在任何大型项目中都这样做。

可以实现一些封装
2

的一个好方法是声明一个模块的内部方法或变量static

1

由于安德烈斯说,static是你的朋友。但是谈到朋友......如果你想能够在两个文件中分离一个库,那么需要在另一个文件中看到的一个文件中的一些符号不能是static。 确定一些命名约定:来自库foo的所有非静态符号均以foo_开头。并确保他们总是遵循:它恰好是它似乎约束的符号(“我需要称之为foo_max?!但它只是max!”),会有冲突。

正如Zan所说,一个典型的Linux发行版可以被看作是一个主要用C编写的巨大项目。有接口,大型子项目实现为独立进程。在不同流程中的实现有助于调试,测试和代码重用,除了链接级别上的唯一一个层次之外,它还提供了第二层次结构。当你的项目变得足够大时,可能开始有意义地将一些功能放在单独的进程中。已经像C编译器一样专用的东西通常被实现为三个进程:预处理器,编译器,汇编器。

3

有些人不喜欢它,但我主张将我的结构和相关函数组织在一起,就好像它们是一个明确传递此指针的类。例如,结合一致的命名约定来明确命名空间。一个标题可能类似于:

typedef struct foo { 
    int x; 
    double y; 
} FOO_T 

FOO_T * foo_new(); 

int foo_set_x(FOO_T * self, int arg1); 

int foo_do_bar(FOO_T * self, int arg1); 

FOO_T * foo_delete(FOO_T * self); 

在实现中,所有“私有”函数都是静态的。这个缺点是你不能强制用户不去和结构体的成员混淆。这只是c中的生活。我发现这种风格虽然可以用于很好的可重用C类型。

+2

风格没问题,但我更喜欢'FOO_T * x; x-> x = 1;'over'FOO_T * x; foo_set_x(x,1);'。对C程序员来说更清楚一点。 (你可以强制用户不通过给定一个'struct'的成员来去混淆,只要说'typedef struct foo FOO_T',然后他们可以使用指向你的类型的指针,而不需要在里面看到。] – 2010-04-28 20:33:03

+0

我同意克里斯 - 要么提供结构的定义,并期望客户端代码改变其成员,或者使用指向typedef惯用语的指针并隐藏内容。 – 2010-05-19 22:08:57

0

如果您可以控制项目(例如内部支付或您向其他人支付),您可以简单地设置规则并使用评论和工具来执行。这种语言没有真正的需要,例如,你可以要求在模块外部使用的所有功能(=一组文件,甚至不需要是单独的)都必须这样标记。实际上,你会迫使开发人员考虑接口并坚持使用它们。

如果你真的想表达观点,你可以定义宏来显示它,例如,

#define PUBLIC 
#define PRIVATE static 

或其他一些。

所以你是对的,纪律是关键。它涉及制定规则并确保遵守规则。

+0

大多数面向对象语言的公共和私有不等于静态和自动。 – 2010-05-19 22:10:06

+0

我同意,纪律是重要的,并且重要的步骤是实现它的规则,评论和工具,但我认为重写是很好的例子 - 设置时不遵守规则。早期评论(代码未完成时)可以降低重写所产生的额外成本。重写决定可能由某人“正式决定”正式决定,并进一步强调要遵循规则。 – 2011-02-26 00:53:03

+0

只要在多个文件包含的头文件中没有使用PRIVATE ... :-) – paercebal 2011-05-11 20:10:51