C显示其年龄的一个方面是代码的封装。许多现代语言都有类,名称空间,包......比组织简单的“包含”更方便组织代码。
由于C仍然是许多大型项目的主要语言。你如何克服其局限?
我认为一个主要因素应该是许多纪律。我想知道你如何处理大量的C代码,你可以推荐哪些作者或书籍。
答案 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
或其他一些。
所以你是对的,纪律是关键。它涉及设定规则并确保遵守规则。