доступ к структуре: разыменование указателя на неполный тип - PullRequest
0 голосов
/ 21 декабря 2011

Когда я пытаюсь использовать и получать доступ к указателям на свои структуры, я продолжаю получать раздражающее сообщение "dereferencing pointer to incomplete type" ....

Например, в моем файле user.h у меня есть это typedef:

typedef struct FacebookUser_t* User;

и в моем файле user.c, который включает user.h У меня есть такая структура:

struct FacebookUser_t {...}; 

Поэтому, когда мне нужен указатель на эту структуру, я использую только User blabla;, он, кажется, работает, и я добавляю его в общий список как Element, который равен void*, и это typedef для него в list.h:

typedef void* Element;

и когда я возвращаю узел из списка, который содержит Element (User), я не могу получить доступ к его членам, что я делаю неправильно?Спасибо!

Ответы [ 3 ]

1 голос
/ 21 декабря 2011

Если вы хотите скрыть определение структуры (вставив фактический блок 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 часто сбивает с толку, на мой взгляд.

1 голос
/ 21 декабря 2011

Проблема в том, что файл C не имеет доступа к реализации этой структуры.

Попробуйте переместить определение структуры в заголовочный файл.

0 голосов
/ 07 июня 2019

Насколько я понимаю, вы пытаетесь получить доступ к членам User ...

... через Элемент, который является недействительным *.Это не может работать, потому что компилятор не знает, к какому типу он должен обращаться.Например:

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;

Сначала вы должны сообщить компилятору, на что указывает ваша пустота *.Для этого вы используете указатель:

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

Я надеюсь, что понял вашу проблему, и это помогает:)

...