【问题标题】:Redefinition errors in .h files.h 文件中的重新定义错误
【发布时间】:2011-03-25 08:18:39
【问题描述】:
//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 文件中包含这些头文件,那么我会得到 ​​p>

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

如果我从 smatrix.h 文件中获取这些 heder 文件,那么错误就会消失,但它会抱怨函数参数中的矩阵类型。我想在 smatrix.c 文件中调用 list.h 和 matrix.h 文件中定义的函数。我该怎么办?提前谢谢..

【问题讨论】:

    标签: c


    【解决方案1】:

    多个夹杂物的可能问题。

    尽量用#ifndefread about it here保护你的头文件

    文件列表.h

    #ifndef _LISTH_
    #define _LISTH_
    
    <your code>
    
    #endif
    

    文件矩阵.h

    #ifndef _MATRIXH_
    #define _MATRIXH_
    
    <your code>
    
    #endif
    

    如果您在标头包含中存在循环,它也会阻止您重新定义。

    【讨论】:

      【解决方案2】:

      您的头文件中需要include guards

      【讨论】:

        【解决方案3】:

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

        如果你的编译器支持的话。

        如果没有这个,如果标题从不同的来源多次包含,你会得到与重新定义相关的错误。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 2011-08-23
            • 1970-01-01
            • 1970-01-01
            • 2010-11-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多