Dav*_*ley 16
C在代码组织方面没有提供太多帮助.有功能和文件.
无论何时想要实现具有隐藏实现的接口,或者可能使用私有函数,都要创建两个文件,如"foo.h"和"foo.c".
接口和/或公共函数是"foo.h"中的函数原型,函数用"foo.c"编写.此外,任何隐藏的实现或其他私有函数都在"foo.c"中,但标记为static,例如static int foo_internal_function(int i);.标记的功能static只能在它们存在的文件中引用,而不能在其他任何文件中引用.
没有正式的命名空间,尽管你可以通过添加函数名称来获得相同的效果,例如Foo_discombobulate_developers().没有类,尽管你至少可以通过文件获得一些封装效果.没有可扩展的层次结构,只有文件和功能.
C在后面的语言组织附近没有任何地方,但是已经写了许多非常好的程序.小心,评论任何令人困惑的事情(在C中可能会有令人困惑的事情),并保持良好的记录.
"具有无穷无尽功能的文件"
你真正想要的是具有明确定义和有限功能集的文件.这称为模块化编程.您的想法是将基于功能的函数分组到单个编译单元中,并在标头中定义函数原型:
foo.h中:
int GetFoo();
Run Code Online (Sandbox Code Playgroud)
foo.c的:
int GetFoo()
{
...
}
Run Code Online (Sandbox Code Playgroud)
它有点类似于将一组方法分组到单个类中的方式.主要区别在于,您可能在任何特定时间都可以使用"这个"东西.也就是说,您仍然可以在C中进行基本上"面向对象"的编程.但是,您的对象将成为模块的参数.这是一种方法:
Bar.h:
typedef int BAR_OBJ
BAR_OBJ MakeBar();
int GetBarSize(BAR_OBJ);
void DoFooToBar(BAR_OBJ, ...)
Run Code Online (Sandbox Code Playgroud)
Bar.c
struct BarDetails
{
int isFree;
int size;
...
// other info about bar
};
static BarDetails arrayOfBars[...]; //
BAR_OBJ MakeBar()
{
// search BarDetails array, find free Bar
}
int GetBarSize(BAR_OBJ obj)
{
return arrayOfBars[obj];
}
void DoFooToBar(BAR_OBJ, ...)
{
// lookup bar obj and do something
}
Run Code Online (Sandbox Code Playgroud)