gpt4 book ai didi

C 编程从具有结构前向声明的实现中解耦接口(interface)

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

我正在编写一个 C 程序并使用 gcc 4.4.6 进行编译。我不想使用 C++ 编译器。

我正在实现一个组件,我打算让这个组件的多个实例在运行时处于事件状态并由其他组件拥有。

作为一种将接口(interface)的定义与其实现分离并隐藏它在该实现中使用的内部结构和数据类型的方法,我希望使用前向结构声明。

接口(interface)文件:component.h

struct _hidden_implementation_type;
typedef struct _hidden_implementation_type visible_type_to_clients;

int component_function1(visible_type_to_clients instance);

实现文件:component.c

struct _hidden_implementation_type
{
int foo;
};

客户端文件:ma​​in.c

int main(int argc, char** argv)
{
visible_type_to_clients a;
return component_function1(a);
}

我如何使它起作用?还有什么其他方法可以允许多个组件实例化并在公共(public)接口(interface)和实现之间提供解耦?

最佳答案

你快到了。您的接口(interface)必须是指向不透明类型的指针:

struct hidden_implementation_type;
typedef struct hidden_implementation_type visible_type_to_clients;

int component_function1(visible_type_to_clients *instance_type);

和:

int main(void)
{
visible_type_to_clients *a = 0;
return component_function1(a);
}

这至少会编译——尽管它不会做任何有用的事情。您可能需要一个功能,例如:

visible_type_to_clients *new_visible(void);

创建一个类型的值并返回一个指针给它,然后你可以使用:

int main(void)
{
visible_type_to_clients *a = new_visible();
return component_function1(a);
}

基本上,客户将无法在您的类型的堆栈(或全局结构)上创建结构,因为您没有告诉编译器该类型有多大。但是您可以处理指针 — 类型化指针比“非类型化”void * 指针安全得多。

为了简单起见,我省略了错误检查。我重写了没有前导下划线的结构标签名称,因为出于所有实际目的,以下划线开头的名称是 reserved for the implementation .我会选择:

typedef struct VisibleType VisibleType;

标签和类型名称相同的地方。

关于C 编程从具有结构前向声明的实现中解耦接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35295826/

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