2013-08-01 99 views
1

我有文件A.c,B.c和B.h。 交流有一個頭文件中的枚舉聲明

enum CMD{ 
    FIRST, 
    SECOND, 
    THIRD, 
}; 

,後來在該文件中有

bool function(...){ 
//... 
enum CMD data_type = FIRST; 
//... 
} 

在文件BC,我需要使用

if (data_type == FIRST){...} 

我試着在BH這包括:

extern enum CMD data_type; 

並且在A.c和B.c中包含#include「B.h」。 所有文件都位於項目的propper文件夾中。 但沒有雪茄:( 卑詩省行給出這樣的:

20: identifier "FROM_SMS" is undefined 
70: incomplete type is not allowed 

如何使這項工作交流文件是別人writen,我modifiing與BC代碼原始代碼是。一個爛攤子,我想盡可能減少:) 架構即STM32和我使用的是uVision 3 IDE。

謝謝

+0

你可能想顯示你的一些實際* *代碼,不是這個'FIRST' ... –

+0

對不起,有嚴格的公司政策對這樣的事情:( –

+3

關於什麼樣的東西?您不必爲了顯示實際的代碼;你只需要產生一個SSCCE([Short,Self-Contained,Correct Example](http://sscce.org/)),它不是公司代碼,而是產生等價的錯誤信息編譯器 –

回答

7

枚舉是一種類型,你應該放在.h中。

extern關鍵字是變量。

編輯:對不起,我仔細閱讀了你的代碼。

這裏的問題是,你會嘗試使用枚舉沒有定義它。 認爲當編譯器編譯某些東西時,它會分別獲取每個.c文件,然後將include的內容「複製」到c文件中。

所以在這裏你將有b.c其中包含b.h但由於你的類型的聲明是在a.c中,編譯器無法知道它,因此在嘗試編譯b.c時會引發錯誤。

要解決這個問題,只需在b.h頂部聲明您的類型並將其包含在兩個文件中,或者創建一個包含在需要它的.h/.c文件中的「myenum.h」文件。

+0

我在Ac中註釋了枚舉CMD {...}; definition(declaration?)並將其包含在Bh中,但現在它給了我'Bo文件中未定義的data_type符號' –

+0

這是因爲data_type是局部的你的函數'bool函數(...)'。 你需要在函數外聲明它,然後希望'bool函數(...)'在你需要之前調用。 n b.c並寫入: 'extern enum CMD data_type;'在你的b.c中,也在任何其他函數定義之外。 –

+0

編譯。我不會在給定的任務結束時使用'bool function()',所以我猜測它沒問題。謝謝。 –

0

enum只是另一種類型的define。它只適用於當前翻譯單位。