克服大型项目的C限制

时间:2010-04-28 19:31:20

标签: c

C显示其年龄的一个方面是代码的封装。许多现代语言都有类,名称空间,包......比组织简单的“包含”更方便组织代码。

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

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

5 个答案:

答案 0 :(得分:19)

  • 将代码分成功能单元。
  • 将这些代码单元构建到单个库中。
  • 在库中使用隐藏符号以减少命名空间冲突。

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

答案 1 :(得分:3)

有些人不喜欢它,但我支持将我的结构和相关函数组织在一起,好像它们是一个显式传递this指针的类。例如,结合一致的命名约定来使命名空间显式化。标题类似于:

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 :(得分:2)

一种可以实现某种封装的好方法是将模块的内部方法或变量声明为static

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

如果您可以控制项目(例如内部或您支付其他人的费用),您只需设置规则并使用评论和工具来强制执行。没有必要使用该语言来执行此操作,例如,您可以要求在模块外部使用的所有函数(=一组文件,甚至不需要是单独的)都必须进行标记。实际上,您会强制开发人员考虑接口并坚持使用它们。

如果您真的想说明问题,您可以定义宏来显示它,例如

#define PUBLIC 
#define PRIVATE static

或其他一些。

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