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"

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

2 ответа

Решение

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

#ifndef TEST_H__
#define TEST_H__

/*you header file can have declarations here*/

#endif /* TEST_H__*/

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

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

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

#ifndef BTREENODE_H
#define BTREENODE_H

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

#endif // BTREENODE_H

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

Другие вопросы по тегам