访问struct:取消引用指向不完整类型的指针

时间:2011-12-21 10:58:48

标签: c pointers struct element void

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

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

typedef struct FacebookUser_t* User;

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

struct FacebookUser_t {...}; 


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

typedef void* Element;

当我从列表中找回包含ElementUser)的节点时,我无法访问它的成员,我做错了什么?谢谢!

3 个答案:

答案 0 :(得分:1)

问题是C文件无法访问该结构的实现。

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

答案 1 :(得分:1)

如果要隐藏结构的定义(通过将实际的struct {块粘贴在单个C文件中并且仅在标题中显示typedef ed名称,则无法访问直接领域。

解决这个问题的一种方法是继续封装,并定义访问器功能,即你有(在user.h中):

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

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

答案 2 :(得分:0)

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

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

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;

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