use*_*505 7 c ansi interface-implementation
我正在研究C中的一个大项目,我想使用接口(.h)和实现(.c)文件来组织它,类似于许多面向对象的语言,如Objective-C或Java.我熟悉在C中创建静态库,但我认为对我的项目这样做是不必要的复杂.如何在ANSI C中实现接口/实现范例?我主要使用GCC进行编译,但我的目标是严格遵守ANSI C和交叉编译器的兼容性.谢谢!
听起来你已经做了正确的事情:好的C代码还组织.h文件中的接口和.c文件中的实现.
示例啊文件:
void f(int a);
Run Code Online (Sandbox Code Playgroud)
示例ac文件:
#include "a.h"
static void helper(void) {...}
void f(int a) {... use helper()...}
Run Code Online (Sandbox Code Playgroud)
示例main.c文件:
#include "a.h"
int main(void) { f(123); return 0; }
Run Code Online (Sandbox Code Playgroud)
你得到模块化,因为helper-functions没有在头文件中声明,所以其他模块不知道它们(.c如果你愿意,可以在文件的顶部声明它们).有了这个模块减少了所需的重新编译的次数,并减少多少已被重新编译.(必须每次都进行链接).请注意,如果您没有在标头中声明辅助函数,那么您已经非常安全,但是static在它们之前也会在链接期间将它们隐藏在其他模块中,因此如果多个模块使用相同的辅助函数,则不会发生冲突 -名.
如果您只使用原始类型,那么您需要知道的就是这里,您可以在这里停止阅读.但是,如果您的模块需要使用结构,那么它会变得更复杂一些.
有问题的示例标题bh:
typedef struct Obj {
int data;
}*Obj;
Obj make(void);
void work(Obj o);
Run Code Online (Sandbox Code Playgroud)
您的模块想要传入和传出对象.这里的问题是,内部泄漏到依赖于此标头的其他模块.如果表示更改为,float data则所有使用模块都必须重新编译.解决此问题的一种方法是仅使用void*.这就是有多少程序.然而,这很麻烦,因为获取void*as参数的每个函数都必须将其转换为Obj.另一种方法是这样做:
标题ch:
typedef struct Obj*Obj;
Obj make(void);
void work(Obj);
Run Code Online (Sandbox Code Playgroud)
实施cc:
#include "c.h"
typedef struct Obj {
int data;
}*Obj;
Run Code Online (Sandbox Code Playgroud)
这样做的原因是,Obj是一个指针(与value/copy的结构相反).依赖于此模块的其他模块只需知道指针正在传入和传出,而不是指向它.
| 归档时间: |
|
| 查看次数: |
5414 次 |
| 最近记录: |