gpt4 book ai didi

c - ANSI C 中的接口(interface)/实现

转载 作者:太空狗 更新时间:2023-10-29 17:10:33 30 4
gpt4 key购买 nike

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

最佳答案

听起来您已经做了正确的事情:好的 C 代码在 .h 文件中组织接口(interface),在 .c 文件中组织实现。

示例 a.h 文件:

void f(int a);

示例 a.c 文件:

#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 文件的顶部声明它们)。拥有这种模块化减少了所需的重新编译次数,并减少了必须重新编译的。 (不过每次都必须进行链接)。请注意,如果您没有在 header 中声明辅助函数,那么您已经很安全了,但是在它们前面放置 static 也会在链接期间将它们从其他模块中隐藏起来,因此如果有多个则不会发生冲突模块使用相同的辅助函数名称。

如果您只使用基本类型,那么您只需要知道这些就可以了,您可以在这里停止阅读。但是,如果您的模块需要使用结构,那么它会变得稍微复杂一些。

有问题的示例 header b.h:

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

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

标题 c.h:

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

执行抄送:

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

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

关于c - ANSI C 中的接口(interface)/实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26205329/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com