2011-03-25 102 views
7
//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文件的头文件,然后我得到.h文件中的重定义错误

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

如果我把这些文件赫德从我们的文件smatrix.h那么错误走开了,但抱怨的函数参数矩阵类型。我想调用在smatrix.c文件中的list.h和matrix.h文件中定义的函数。我该怎么做?在此先感谢..

回答

16

可能存在多个夹杂物的问题。

尝试后卫

文件list.h

#ifndef _LISTH_ 
#define _LISTH_ 

<your code> 

#endif 

文件matrix.h

#ifndef _MATRIXH_ 
#define _MATRIXH_ 

<your code> 

#endif 

它会阻止你也必须重新定义,如果你有一个循环的头文件标题包含。

+0

_list.h_是这样的吗? – codereviewanskquestions 2011-03-25 08:27:24

+0

@LCYSoft编辑 – 2011-03-25 08:29:33

+1

谢谢loooot! – codereviewanskquestions 2011-03-25 08:42:50

1

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

这些是你(到底有#endif)文件的开头#ifdef检查宏和#define他们#ifdef ... #endif内,从而确保即使你使用相同的文件多次,编译器会第一次只读一次,然后跳过所有其他的。

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 

,如果你的编译器支持它。

如果没有这个,如果标题被多次包含在各种来源中,你会得到与重新定义有关的错误。