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

//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文件。我该怎么办? 提前致谢..

多重夹杂物的可能问题。

尝试使用保护您的头文件

文件列表

 #ifndef _LISTH_ #define _LISTH_  #endif 

file matrix.h

 #ifndef _MATRIXH_ #define _MATRIXH_  #endif 

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

你需要在头文件中包含警卫 。

从您发布的代码中我认为缺少的是每个* .h文件的开头:

 #ifndef _some_unique_identifier_for_each_header #define _some_unique_identifier_for_each_header ...header contents #endif //_some_unique_identifier_for_each_header 

或者a

 #pragma once 

如果您的编译器支持它。

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

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

这些是您在文件开头用#ifdef检查的宏(最后是#endif ),并在#ifdef ... #endif #define ,从而确保即使您确实包含相同的文件多个次,编译器只会在第一次读取它,并跳过所有其余的。