2016-11-09 140 views
1

我想了解我的編譯器在C語言中的錯誤。未知類型名稱錯誤與typedef結構和extern聲明 - C語言

在文件application.h,我創建了一個typedef結構:

typedef struct 
{ 
    FLOAT64 CoefficientA1_F64; 
    FLOAT64 CoefficientA2_F64; 
    FLOAT64 CoefficientB0_F64; 
    FLOAT64 CoefficientB1_F64; 
    FLOAT64 CoefficientB2_F64; 
    FLOAT32 OldOldRawValue_F32; 
    FLOAT32 OldRawValue_F32; 
    FLOAT32 RawValue_F32; 
    FLOAT32 OldOldFilteredValue_F32; 
    FLOAT32 OldFilteredValue_F32; 
    FLOAT32 FilteredValue_F32; 
}ButterwothSecondOrderFilterParameter_str; 

然後我在另一個文件中temperature.c創建變量:

ButterwothSecondOrderFilterParameter_str TMP_TemperatureLowPassFilterParameter_STR; 

然後我宣佈這個新的變量爲extern在temperature.h中可以使用它在另一個文件中:

extern ButterwothSecondOrderFilterParameter_str TMP_TemperatureLowPassFilterParameter_STR; 

對於* .c文件我只包含他的相關* .h文件,如果我需要另一個* .h文件的全局變量,我將它包含在* .h文件中

例如,temperature.c只包含temperature.h並且可以訪問typedef application.h的結構我在temperature.h中包含application.h。

對於我的* .h文件,我總是以封裝:

#ifndef xxxx 
#define xxxx 
#endif 

這是產生一個錯誤這最後聲明:

Description Resource Path Location Type 
unknown type name 'ButterwothSecondOrderFilterParameter_str' 

我不知道哪裏是我的錯誤。 ...?

+2

如果你只包含'temperature.h'頭文件,而不是'application.h'頭文件,那麼編譯器如何知道符號'ButterwothSecondOrderFilterParameter_str'是什麼? –

+0

'temperature.h'必須包含'application.h'來表示類型。你應該能夠在'temperature.c'的頂部包含'temperature.h',並且文件應該被編譯(這使得頭文件是獨立的)。目前,該文件不能編譯;標題不是獨立的。標題保護用於確保標題是冪等的;即使它們包含多次,其效果與包括它們一次相同。 –

+0

而不是用單詞解釋,用代碼解釋:請提供[mcve]。目前還不清楚你的問題來自哪裏。 – user694733

回答

0

剛好我包含application.h in temperature.h。那麼temperature.h是temperature.c中包含的唯一文件。我補充說,temperature.h也包含在application.h中,通常沒有後果。

我試着直接在temperature.c中添加application.h,但是我有同樣的錯誤。

我試圖刪除temperature.h中的extern聲明,它的工作原理。

因此,溫度h的未知類型,但不溫度c ....我不明白。