使用指向非结构类型的不透明指针
Using an opaque pointer to a non struct type
在我的 C 编程中,我使用不透明指针来构造,以此方式强制抽象和封装我的代码:
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
。
我也在考虑做一个只有一个成员的结构,这将是我的简单类型,但这会不会太过分了?
感谢您的回答。
你必须做出决定。使用这样的代码:
typedef char myHandle;
frobnicate(myHandle *obj);
您已经记录了 意图 客户端代码应该只使用指向 myHandle
的指针并且永远不要对基础类型进行任何假设,因此您应该能够更改typedef
稍后 -- 除非 有 "sloppy" 客户端代码做出不应该的假设。
如果您想完全隐藏 myHandle
后面的内容,struct
是您在 C:
中唯一的选择
typedef struct myHandle myHandle;
frobnicate(myHandle *obj);
并且仅在私有头文件或实现文件中,您将放置
struct myHandle
{
char val;
};
第一个选项更简单,因为在 frobnicate()
的实现中,您可以简单地使用 *obj
访问您的值,而第二个选项需要编写 obj->val
。使用第二个版本的好处是您强制 正确编写客户端代码。
就生成的可执行文件而言,两个版本是等效的。
在我的 C 编程中,我使用不透明指针来构造,以此方式强制抽象和封装我的代码:
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
。
我也在考虑做一个只有一个成员的结构,这将是我的简单类型,但这会不会太过分了?
感谢您的回答。
你必须做出决定。使用这样的代码:
typedef char myHandle;
frobnicate(myHandle *obj);
您已经记录了 意图 客户端代码应该只使用指向 myHandle
的指针并且永远不要对基础类型进行任何假设,因此您应该能够更改typedef
稍后 -- 除非 有 "sloppy" 客户端代码做出不应该的假设。
如果您想完全隐藏 myHandle
后面的内容,struct
是您在 C:
typedef struct myHandle myHandle;
frobnicate(myHandle *obj);
并且仅在私有头文件或实现文件中,您将放置
struct myHandle
{
char val;
};
第一个选项更简单,因为在 frobnicate()
的实现中,您可以简单地使用 *obj
访问您的值,而第二个选项需要编写 obj->val
。使用第二个版本的好处是您强制 正确编写客户端代码。
就生成的可执行文件而言,两个版本是等效的。