当我尝试使用并访问指向我的结构的指针时,我不断收到"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;
当我从列表中找回包含Element
(User
)的节点时,我无法访问它的成员,我做错了什么?谢谢!
答案 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;
希望我能理解您的问题,这对您有帮助:)