c - 使用指向非结构类型的不透明指针

标签 c typedef encapsulation opaque-pointers

在我的 C 编程中,我使用不透明指针来构造,以此方式强制抽象和封装我的代码:

interface_header.h:

 typedef struct s_mytype t_mytype;

defs_header.h:

struct s_mytype
{
/* Actual definition of the struct */
};

我的问题我想使用一个简单的类型作为t_mytype(例如char),但不通知接口(interface)。我不能只使用 typedef char t_mytype,因为那样会暴露类型的内部结构。 我可以只使用 void 指针,但以类型检查为代价,我宁愿避免这种情况。

做两个 typedef 也不会起作用,因为这会从编译器中抛出一个 不同类型的 typedef 重新定义

我也在考虑做一个只有一个成员的结构,这将是我的简单类型,但这会不会有点矫枉过正?

感谢您的回答。

最佳答案

你必须做出决定。使用这样的代码:

typedef char myHandle;

frobnicate(myHandle *obj);

您已经记录了客户端代码应该只使用指向 myHandle 的指针的意图,并且从不假设任何关于底层类型的信息,因此您应该能够更改 typedef 稍后——除非有“马虎”的客户端代码做出了不应该的假设。


如果您想完全隐藏myHandle 背后的内容,struct 是您在 C 中唯一的选择:

typedef struct myHandle myHandle;

frobnicate(myHandle *obj);

并且仅在私有(private)头文件或实现文件中,您将放置

struct myHandle
{
    char val;
};

第一个选项更简单,因为在 frobnicate() 的实现中,您可以简单地使用 *obj 访问您的值,而第二个选项需要编写 obj->val.第二个版本的好处是您可以强制正确编写客户端代码。

就生成的可执行文件而言,两个版本是等效的。

关于c - 使用指向非结构类型的不透明指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47270036/

相关文章:

c++ - "Pinnacle"of Encapsulation - 关于Effective C++ Advice的问题

c# - OOP 中的封装

带有内联汇编代码的 %hi() 和 %lo() 编译错误

c - 如何直接操作输出流? (是 : why it's not increment value of increment operator in case of assignment in c? )

c - 这种声明有什么用呢?

Delphi如何使用typedef void *参数调用C++ dll函数?

android - 在 StringDef/TypeDef android 中使用资源字符串值

c - C 错误引用中的内联汇编

c - C 中的全局变量和动态分配变量有什么区别?

java - Java中集合类的继承与封装