2014-11-19 2 views
0

Так, у меня есть следующие файлы .h: StudentRosterDef.h и StudentRoster.hНе понимая это опережающее объявление, что я получаю

StudentRosterDef.h:

typedef struct Node *NodeP; 
typedef struct Student *StudentP; 

StudentRoster.h:

typedef struct StudentRoster *StudentRosterP; 

//Below prototype creates empty studentroster and returns a NULL pointer 
StudentRosterP newStudentRoster(); 

Теперь у меня есть следующий файл .c сопроводить: StudentRoster.c

StudentRoster.c:

#include "StudentRosterDef.h" 
#include "StudentRoster.h" 

struct StudentRosterP 
{ 
    NodeP root; 
}; 

struct NodeP 
{ 
    StudentP left; 
    StudentP right; 
}; 

StudentRosterP newStudentRoster() 
{ 
    StudentRosterP thisRoster = (StudentRosterP) malloc(sizeof(StudentRosterP)); 
    thisRoster->root = 0x00; 
    thisRoster = 0x00; 
    return thisRoster; 
}; 

Вот сообщение я получаю после запуска ССАГПЗ команды на терминале:

StudentRoster.c:27:12 : error: incomplete definition type of 'struct StudentRoster' 
     thisRoster->root = 0x00; 

     ~~~~~~~~^ 

./StudentRoster.h:14:16: note: forward declaration of 'struct StudentRoster' 
    typedef struct StudentRoster *StudentRosterP; 
       ^

1 error generated. 

Файл StudentRoster.h не может быть изменено или модифицировано в любом случае, как это подается файл и .c и другие сопровождающие файлы .h должны быть построены так, чтобы точно соответствовать описанию StudentRoster.h. Спасибо за любую помощь заранее!

+0

Даже если вы объявили псевдонимы типов, они все еще ссылаются на фактические структуры. Если код не имеет реальных структур, то он не может использовать псевдонимы типов. –

+0

См. [Это хорошая идея для указателей typedef?] (Http://stackoverflow.com/questions/750178/is-it-a-good-idea-to-typedef-pointers/) –

+0

Хм, я сортирую получить то, что вы говорите, но вы могли бы экстраполировать эту идею немного больше, пожалуйста @JoachimPileborg – like9orphanz

ответ

0

У вас есть:

typedef struct StudentRoster *StudentRosterP; 

Вы также:

struct StudentRosterP 
{ 
    NodeP root; 
}; 

Эти типы не связаны; вам необходимо:

struct StudentRoster // No P at the end here! 
{ 
    NodeP root; 
}; 

Промыть и повторить.

(Обратите внимание, что brunocodutra говорил так же, как это в своей answer, но это, возможно, не было сказано совсем так точно или сжато, по крайней мере, не в первую очередь.)


Могли бы вы объясните, почему НЕ иметь указатель как определение структуры, дал бы мне ошибку.

Суффикс P - конвенция человека; компилятор не знает, что соглашение существует. Когда вы определяете struct StudentRosterP, вы все еще не определили struct StudentRoster, который необходим для доступа к внутренним устройствам StudentRosterP thisRoster;. Это определяет переменную, которая является указателем на неполный тип struct StudentRoster. Вы можете использовать и использовать такие указатели, если вам не нужно ничего доступного в структуре. Они «непрозрачные типы» и очень полезны. Но с использованием thisRoster->root пытается получить доступ к внутренним элементам непрозрачного типа, и это не сработает.

Я думаю, это все еще одна причина не любить using typedef with pointers, хотя я понимаю, что ваши руки связаны с именами типов.

+0

Не могли бы вы объяснить, почему НЕ иметь указатель, как определение структуры, даст мне ошибку. Кстати, это сработало, спасибо вам большое! – like9orphanz

2

Вам нужно определить типы struct Node и struct StudentRoster вместо использования имени указателя определений типов (struct NodeP и struct StudentRosterP), так что следующий фрагмент кода, вероятно, что вы на самом деле означает:

struct StudentRoster // No P 
{ 
    NodeP root; 
}; 

struct Node // No P 
{ 
    StudentP left; 
    StudentP right; 
}; 
Смежные вопросы