3

在我的 C 编程中,我使用 opaque-pointers 来构建结构,以这种方式强制抽象和封装我的代码:

interface_header.h:

 typedef struct s_mytype t_mytype;

defs_header.h:

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

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

做两个 typedef 也不起作用,因为这会typedef redefinition with different types从编译器中抛出一个。

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

感谢您的回答。

4

1 回答 1

3

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

typedef char myHandle;

frobnicate(myHandle *obj);

您已经记录了客户端代码应该只使用指针而不假设任何关于底层类型的意图myHandle,因此您应该能够更改typedef后者——除非有“草率”的客户端代码做出不应该的假设。


如果你想完全隐藏后面的内容myHandle,astruct是你在 C 中的唯一选择:

typedef struct myHandle myHandle;

frobnicate(myHandle *obj);

并且仅在私有头文件或实现文件中,您将

struct myHandle
{
    char val;
};

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

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

于 2017-11-13T19:20:43.663 回答