Заголовок структуры ошибок компоновщика в C - PullRequest
0 голосов
/ 08 ноября 2010

У меня есть объявление структуры в заголовке globalStruct.h

#ifndef _GLOBALSTRUCT_H
#define _GLOBALSTRUCT_H
typedef struct 
    {

        Int32   frameID;
        Int32   slotIndx;
        Int32   symNumber;

    }   recControlList;     
        recControlList  *recControlListPtr;

#endif

fun.h is

включает "globalStruct.h"

void fun (recControlList * recControlListPtr);

Внутри File1.c я делаю следующее

#include "globalStruct.h"
#include "fun.h"

recControlList  temp;
recControlListPtr=&temp;

fun( recControlListPtr); //Function prototype is declared in some fun.h file.

fun.c выглядит как

#include "globalStruct.h"

void fun (recControlList * recControlListPtr)

Я получаю ошибку компоновщика: _recControlListPtr определен несколько раз. один в File1.c и другой fun.c

Я не понимаю, что здесь не так? globalStruct нужен extern?

Спасибо

Ответы [ 2 ]

2 голосов
/ 08 ноября 2010

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

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

Что вам нужно сделать, это убедиться, что существует только один экземпляр. В заголовочном файле замените:

recControlList  *recControlListPtr;

с:

extern recControlList  *recControlListPtr;

Затем в одном ваших C-файлов поместите:

recControlList  *recControlListPtr;

Итог: старайтесь не определять что-либо в заголовочных файлах. Объявлять вещи (заявляя , что они существуют, такие как прототипы, внешние, typedefs, структуры и т. Д.) - все в порядке, определение (выделение пространства для переменных, предоставление тел функций и т. Д.), Как правило, не *. 1024 *

0 голосов
/ 08 ноября 2010

Если вы включаете заголовочный файл более одного раза в вашу программу, вы должны либо:

a) быть более осторожными с объявлениями, которые у вас есть в заголовке

ИЛИ

b) вставьте охранники включения, чтобы убедиться, что заголовок не будет включен дважды, для получения дополнительной информации ознакомьтесь с защитой включения IFNDEF и IFDEF.

PM

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...