在我的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
。
我也在考虑只用一个成员做一个结构,这将是我的简单类型,但这会是一种过度杀伤吗?
感谢您的回答。
答案 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
。您获得的第二个版本是强制客户端代码正确写入。
就生成的可执行文件而言,两个版本都是等效的。