extern для новой определенной структуры в C - PullRequest
0 голосов
/ 18 января 2012

У меня есть main, в котором я использовал структуру узла, однако определение узла и его манипуляций находится в файле в каталоге с именем NODE /

. Я создал NODE / node.h, который имеет:

typedef struct node node;

struct node
{
        int my_reg;
        node *left;
        node *right;
} ;

Я создал NODE / node.c и включил в него node.h, в котором есть node_insert node_remove;

Однако я использую структуру узлов в school_address.c, в которую я также включаю NODE /node.h и NODE / node.c

Я пытался поместить

extern struct node

в school_address.c

Пока код не компилируетсяи жалуется на переопределение в node.h

Есть идеи?

Ответы [ 3 ]

2 голосов
/ 18 января 2012

extern для переменных, а не для определения типов.Вы должны просто включить заголовок во все модули, которые должны знать о struct node;который заменяет содержимое всего заголовка, встроенное.

Что вы должны , а не сделать, это включить C-файл в другой C-файл.Вместо этого вы должны объявить прототипы общих функций в заголовке.

Например,

#include "node.h"

int main()
{
    // whatever
}

становится, если вы поместите прототип для node_insert в заголовок,

typedef struct node node;

struct node
{
        int my_reg;
        node *left;
        node *right;
};

struct node *node_insert(struct node *, int);  // or whatever the prototype is

int main()
{
    // whatever
}

после того, как препроцессор C завершил работу с ним, поэтому struct node и node_insert видны в main.

1 голос
/ 18 января 2012

Вы ищете Включить охрану .

В частности, используйте

#ifndef node_h_
#define node_h_ 1

в начале файла node.h и соответствующий

#endif

в конце.

Также не включайте .c файлы.

0 голосов
/ 18 января 2012

Когда ваши заголовочные файлы включены в несколько файлов C, вы должны включить их в директивы препроцессора, чтобы избежать двойных определений, таких как:

#ifndef __NODE_H_INCLUDED__
#define __NODE_H_INCLUDED__

struct node...

#endif

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

...