使用指向非结构类型

时间:2017-11-13 17:22:02

标签: c typedef encapsulation opaque-pointers

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

interface_header.h:

 typedef struct s_mytype t_mytype;

defs_header.h:

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

我的问题我想使用简单类型t_mytype(例如char),但不通知接口。我不能只使用typedef char t_mytype,因为这会暴露该类型的内部。 我可以使用void指针,但是以类型检查为代价,我宁愿避免使用它。

执行两个typedef也不会工作,因为它会从编译器中抛出typedef redefinition with different types

我也在考虑只用一个成员做一个结构,这将是我的简单类型,但这会是一种过度杀伤吗?

感谢您的回答。

1 个答案:

答案 0 :(得分:3)

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

typedef char myHandle;

frobnicate(myHandle *obj);

您已经记录意图,客户端代码应仅使用指向myHandle的指针,并且永远不会假设有关基础类型的内容,因此您应该能够更改typedef之后 - 除非那里"马虎"客户代码做出假设它不应该。

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

typedef struct myHandle myHandle;

frobnicate(myHandle *obj);

并且只在私有标头或实现文件中,您将放置

struct myHandle
{
    char val;
};

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

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