我知道一些更高级的语言,所有基于Web(PHP,javascript,一些python).我终于决定学习一门低级语言了,我决定和C一起去.问题是我使用的所有语言都是基于OOP.看作(基于我所做的研究)C没有类或继承.因此,我问你:我应该如何以有组织的方式在O中组织我的代码,而不必切换语言或只是拥有无穷无尽的函数文件?
从未来编辑:这个问题非常愚蠢地回顾它.我15岁,在我的学校没有CS ......
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();
foo.c的:
int GetFoo() { ... }
它有点类似于将一组方法分组到单个类中的方式.主要区别在于,您可能在任何特定时间都可以使用"这个"东西.也就是说,您仍然可以在C中进行基本上"面向对象"的编程.但是,您的对象将成为模块的参数.这是一种方法:
Bar.h:
typedef int BAR_OBJ BAR_OBJ MakeBar(); int GetBarSize(BAR_OBJ); void DoFooToBar(BAR_OBJ, ...)
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 }