代码之家  ›  专栏  ›  技术社区  ›  VannTen

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

  •  3
  • VannTen  · 技术社区  · 8 年前

    在我的C编程中,我使用指向struct的不透明指针作为强制抽象和封装代码的一种方式,方式如下:

    接口_头。h:

     typedef struct s_mytype t_mytype;
    

    defs_标题。h:

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

    我的问题是我想用一个简单的类型作为 t_mytype ( char 例如),但不通知接口。我不能只用 typedef char t_mytype 我可以只使用void指针,但要以类型检查为代价,我宁愿避免这种情况。

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

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

    谢谢你的回答。

    1 回复  |  直到 8 年前
        1
  •  3
  •   user2371524 user2371524    8 年前

    你必须做出决定。代码如下:

    typedef char myHandle;
    
    frobnicate(myHandle *obj);
    

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


    如果你想完全隐藏背后的东西 我的手柄 struct 是C语言中的唯一选项:

    typedef struct myHandle myHandle;
    
    frobnicate(myHandle *obj);
    

    struct myHandle
    {
        char val;
    };
    

    第一个选项更简单,因为在 frobnicate() ,您只需使用 *obj 而第二个选项需要写入 obj->val . 第二个版本的好处是 武力 正确编写客户端代码。

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