【问题标题】:accessing struct: derefrencing pointer to incomplete type访问结构:取消引用指向不完整类型的指针
【发布时间】:2011-12-21 10:58:47
【问题描述】:

当我尝试使用和访问指向我的结构的指针时,我不断收到 "dereferencing pointer to incomplete type" 的烦人消息 ....

例如在我的user.h 文件中,我有这个typedef

typedef struct FacebookUser_t* User;

在包含user.h 的我的user.c 文件中,我有这个结构:

struct FacebookUser_t {...}; 


所以当我需要一个指向该结构的指针时,我只使用User blabla; 它似乎有效,我将它添加到通用列表中为Element,即void*,这就是list.h中的typedef:

typedef void* Element;

当我从包含Element (User) 的列表中取回一个节点时,我无法访问它的成员,我做错了什么?谢谢!

【问题讨论】:

    标签: c pointers struct element void


    【解决方案1】:

    问题在于 C 文件无权访问该结构的实现。

    尝试移动头文件中结构的定义。

    【讨论】:

    • 好的,我已经试过了,我把结构定义放在 user.h 和它的 typedef 中,但仍然无法从其他 .c 文件访问它,即使它们包含该 user.h
    【解决方案2】:

    如果您想隐藏结构的定义(通过将实际的 struct { 块粘贴在单个 C 文件中并仅在标头中公开 typedefed 名称,则不能期望直接访问这些字段。

    解决此问题的一种方法是继续封装,并定义访问器函数,即您将拥有(user.h):

    const char * user_get_name(const User user);
    void         user_set_name(User user, const char *new_name);
    ...
    

    请注意,在我看来,在 typedef 中包含 * 通常会让人感到困惑。

    【讨论】:

      【解决方案3】:

      据我了解,您尝试访问用户的成员...

      ...通过一个元素,它是一个 void *。这是行不通的,因为编译器不知道它应该取消引用什么类型。例如:

      int *intPtr = getIntPtr();
      //Here the compiler knows that intPtr points to an int, so you can do
      int i = *intPtr;
      
      User *userPtr = getUserPtr();
      //Here the compiler knows that userPtr points to an instance of User so you can do 
      User usr = *usrPtr;
      //or access its member via ->
      auto x = usr->someMember;
      
      Element el = getElementFromSomewhere();
      //el is of type void *!! void *can point to anything and everything
      //the compiler has no clue what you want to do! So this both fails:
      usr = *el; 
      el->someMember;
      

      您首先需要告诉编译器您的 void * 指向什么。为此,您需要投射指针:

      Element el = getElementFromSomewhere();
      User *usrPtr = (User *)el;
      

      我希望我能理解你的问题,这对你有帮助:)

      【讨论】:

        猜你喜欢
        • 2014-05-09
        • 2021-07-25
        • 1970-01-01
        • 2017-02-24
        • 1970-01-01
        • 2014-07-06
        • 1970-01-01
        • 2013-12-22
        • 1970-01-01
        相关资源
        最近更新 更多