2011-03-25 40 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 

,如果你的編譯器支持它。

如果沒有這個,如果標題被多次包含在各種來源中,你會得到與重新定義有關的錯誤。