Ошибки переопределения в .h файлах - PullRequest
8 голосов
/ 25 марта 2011
Файл
//list.h file
typedef struct _lnode{
    struct _lnode *next;
    size_t row;
    size_t column;
    short data;
}lnode;

typedef struct _llist{
    struct _lnode *head;
    size_t size;

}llist;

//matrix.h file
typedef struct _matrix{

    size_t width;
    size_t height;
    size_t k;

    int **data;

}matrix;

//smatrix.h file
#include "list.h"
#include "matrix.h"

typedef struct _smatrix{
    size_t width;
    size_t height;
    size_t k;

    llist data;
}smatrix;

smatrix* make_smatrix(matrix *m);

smatrix.h включает файл list.h и файл matrix.h.Если я включу эти заголовочные файлы в файл smatrix.h, тогда я получу

 redefinition of 'lnode'. redefinition of '_llist' and redefinition of '_matrix' errors.

Если я взял эти файлы хедера из нашего файла smatrix.h, то ошибка исчезнет, ​​но она жалуется на тип матрицы в параметре функции,Я хочу вызвать функции, определенные в файлах list.h и matrix.h в файле smatrix.c .. Что мне делать?Заранее спасибо ..

Ответы [ 4 ]

19 голосов
/ 25 марта 2011

Возможна проблема множественных включений.

Попробуйте защитить файлы заголовков с помощью #ifndef , прочитайте об этом здесь

file list.h

#ifndef _LISTH_
#define _LISTH_

<your code>

#endif

file matrix.h

#ifndef _MATRIXH_
#define _MATRIXH_

<your code>

#endif

Это также предотвратит переопределения, если у вас есть цикл во включениях заголовка.

8 голосов
/ 25 марта 2011

вам нужно включить охрану в заголовочные файлы.

2 голосов
/ 25 марта 2011

Что ж, из вашего опубликованного кода я думаю, что в начале каждого * .h файла отсутствует:

#ifndef _some_unique_identifier_for_each_header 
#define _some_unique_identifier_for_each_header

...header contents

#endif //_some_unique_identifier_for_each_header

или

#pragma once 

, если ваш компилятор поддерживает это.

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

1 голос
/ 25 марта 2011

Возможно, вы включили smatrix.h и list.h в другой файл. Вам следует избегать этого. Обычный способ сделать это - использовать include guards.

Это макросы, которые вы проверяете с помощью #ifdef в начале файла (с #endif в конце) и #define их внутри #ifdef ... #endif, таким образом гарантируя, что даже если вы включите то же самое несколько раз, компилятор прочитает его только один раз и пропустит все остальные.

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