2013-03-22 3 views
-1

Допустим, у нас есть два структур в исходном файле:Разыменование указателя на неполный тип

struct B { 
    int x; 
}; 

struct A { 
    beta y; 
}; 

В эквивалентном заголовочном файле мы имеем эти:

typedef B* beta; 
typedef A* alpha; 

Кроме того, эти прототипы функций определены в файле заголовка:

printAplha(alpha); 
compare(const beta, const beta); 

В основном файле я включил конкретный заголовочный файл, и код выглядит l икэ это:

alpha one, two; 
printAlpha(one); 
printAlpha(two); 
//everything works fine up to here 
compare(one->y, two->y); 

В последней строке кода я получаю

main.c:37:20: error: dereferencing pointer to incomplete type
main.c:37:33: error: dereferencing pointer to incomplete type

Я знаю, что я могу использовать функцию-оболочку для compare, аргументы которых будет иметь тип alpha (как аргументы функции сравнения не могут быть изменены - это рекурсивный), но я хотел бы посмотреть, есть ли другое решение и почему это происходит.

Примечание: определения структуры были записаны в исходный файл для шифрования их внутренней структуры.

+0

Почему мой вопрос ниспровергнут? Может ли кто-нибудь объяснить причину, чтобы узнать, что я сделал неправильно? – Chris

ответ

1

Вы пытаетесь объявить непрозрачный тип данных для struct A и struct B с использованием typedefs, но в то же время вы пытаетесь получить доступ к полям с использованием такого непрозрачного типа.

Вы можете выполнить только одно из указанных выше, не одновременно.

Решение состоит в том, чтобы либо разоблачить полное определение структуры, либо предоставить вспомогательные методы, которые помогут получить доступ к определенным полям. Реализация вспомогательных методов снова потребует доступа к определению полной структуры.

+0

Спасибо Tuxdude, у вас есть то, что я пытался сделать точно! Я создам вспомогательные методы. – Chris

1

В то, что вы делаете, в вашей работе не существует «шифрования», но это делает невозможным отображение кода вашего примера в реализации этих структур. Если вы хотите получить доступ к полям в структуре, вам необходимо сделать полное определение структуры видимым для этой единицы перевода. В противном случае это неполный тип, как указано в сообщении об ошибке.

Смежные вопросы