.h文件中的重新定义错误

时间:2011-03-25 08:18:40

标签: c

//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文件中获取了那些heder文件,那么错误就会消失,但它会在函数参数中抱怨矩阵类型。我想调用list.h中定义的函数和smatrix.c文件中的matrix.h文件。我该怎么办?提前谢谢..

4 个答案:

答案 0 :(得分:19)

多重夹杂物的可能问题。

尝试使用#ifndef read about it here

保护您的标头文件

file list.h

#ifndef _LISTH_
#define _LISTH_

<your code>

#endif

file matrix.h

#ifndef _MATRIXH_
#define _MATRIXH_

<your code>

#endif

如果你在标题包含中有一个循环,它会阻止你重新定义。

答案 1 :(得分:8)

您的标头文件中需要include guards

答案 2 :(得分:2)

根据您发布的代码,我认为缺少的是每个* .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 

如果您的编译器支持它。

如果没有这个,如果从各种来源多次包含标题,则会出现与重新定义相关的错误。

答案 3 :(得分:1)

您可能在其他文件中包含smatrix.hlist.h。你应该避免这种情况。通常的方法是使用include guards

这些是您在文件开头#ifdef检查的宏(最后是#endif),#define位于#ifdef ... #endif内,因此可以保证即使你确实多次包含同一个文件,编译器也只会在第一次读取它一次,并跳过所有其余文件。