2014-02-12 2 views
3

Перед тем, как продолжить, вот код, который дает мне ошибку:C, «конфликтные ситуации для ...» ошибок

#define numScores 3    // the number of test scores which a student will have 

struct btreenode{ 
int studentID;    // the ID number of the student at the current node 

float scores[3];   // the 3 test scores of the student 

float average;    // the average of the 3 test scores for the student 

struct btreenode *left;  // pointer to left side of the tree 
struct btreenode *right; // pointer to right side of the tree 
}; 

typedef struct btreenode *Node; 

я получаю следующее сообщение об ошибке при компиляции:

btreenode.h:17: error: redefinition of 'struct btreenode' 
btreenode.h:28: error: conflicting types for 'Node' 
btreenode.h:28: note: previous declaration of 'Node' was here 

у меня есть блок комментария в верхней части, так что номера строк выключены, но

линия 17 является первой линией «struct btreenode{»

строка 28 - последняя строка «typedef struct btreenode *Node»

Кто-нибудь знает, почему я получаю эти ошибки?

+0

Вы имеете в виду 'struct btreenode * Node;'? – herohuyongtao

+0

Нет ошибок для меня. [См. Онлайн-демонстрацию успешной компиляции] (http://codepad.org/r2pHTtuE). –

+0

скомпилирован для меня тоже. –

ответ

6

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

#ifndef TEST_H__ 
#define TEST_H__ 

/*you header file can have declarations here*/ 

#endif /* TEST_H__*/ 

Я предполагаю, что такого типа подхода нет в вашем файле заголовка.

1

Похоже, что ваш файл btreenode.h включен (прямо или косвенно) несколько раз ... вот почему «предыдущее объявление» и «конфликтующие типы» находятся в одном файле в одной строке (предыдущая декларация на первом включении, конфликтующие типы, когда она работает в одной строке на следующей, включают).

Вы должны использовать защитники заголовков (в btreenode.h), чтобы предотвратить обработку кода файла заголовка, если он уже включен. В верхней части файла добавьте:

#ifndef BTREENODE_H 
#define BTREENODE_H 

и в конце файла добавьте:

#endif // BTREENODE_H 

Таким образом, все, что между теми, будет составлен только если BTREENODE_H не было уже #define г из предыдущего включения.

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