ANSI C中的接口/实现

用户名

我正在用C开发一个大型项目,我想使用接口(.h)和实现(.c)文件来组织它,类似于许多面向对象的语言,例如Objective-C或Java。我熟悉用C创建静态库的过程,但是我认为这样做对我的项目来说不必要地复杂。如何在ANSI C中实现接口/实现范例?我主要使用GCC进行编译,但我的目标是严格遵守ANSI C和跨编译器兼容性。谢谢!

伯恩·埃尔克曼

听起来您已经做对了:好的C代码还可以组织.h文件中的接口和.c文件中的实现。

例子啊文件:

void f(int a);

ac文件示例:

#include "a.h"
static void helper(void) {...}
void f(int a) {... use helper()...}

示例main.c文件:

#include "a.h"
int main(void) { f(123); return 0; }

您获得了模块化,因为辅助函数未在标头中声明,因此其他模块不知道它们(如果需要,可以在.c文件顶部声明它们)。有了这个模块减少了所需的重新编译的次数,并减少多少已被重新编译。不过,每次都必须进行链接)。请注意,如果您没有在标头中声明辅助功能,那么您已经很安全了,但是static在链接过程中使用它们的前面也会在其他模块中隐藏它们,因此,如果多个模块使用相同的辅助功能,则不会发生冲突。名称。

如果您只使用原始类型,那就是您所需要知道的,您可以在这里停止阅读。但是,如果您的模块需要使用结构,则它会稍微复杂一点。

有问题的示例标头bh:

typedef struct Obj {
    int data;
}*Obj;
Obj make(void);
void work(Obj o);

您的模块要传入和传出对象。这里的问题是,内部泄漏给依赖于此头文件的其他模块。如果将表示更改为,float data则所有使用模块都必须重新编译。解决此问题的一种方法是仅使用void*那就是有多少程序做到这一点。但这很麻烦,因为每个获取void*as参数的函数都必须将其强制转换为Obj另一种方法是这样做:

标题ch:

typedef struct Obj*Obj;
Obj make(void);
void work(Obj);

实施cc:

#include "c.h"
typedef struct Obj {
    int data;
}*Obj;

之所以可行,是因为Obj是一个指针(与按值/复制的结构相反)。依赖于此模块的其他模块仅需要知道正在传入和传出指针,而不需要知道它指向的是什么。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章