2010-10-12 81 views
2

的我得到了一個錯誤:枚舉消息的重新聲明,當我編譯我的代碼,請您看下面的代碼從我的了foo.h頭文件,重新說明枚舉

//foo.h 

struct FG 
{ 
    enum 
    { 
     black = 1, 
     red = 2, 
     green = 3 
    }; 
}; 

struct BG 
{ 
    enum 
    { 
     black = 1, 
     red = 2, 
     green = 3 
    }; 
}; 

我的問題是,爲什麼我收到統計員重新宣佈?我的枚舉是在不同的結構,所以我可以使用以下,

BG::black 
FB::black 

請指教。

編輯:這裏是確切的錯誤

/home/sasayins/foobar/foo.h:10: error: redeclaration of enumerator ‘black’ 
/home/sasayins/foobar/foo.h:3: note: previous definition of ‘black’ was here 
+1

你確定你沒有包含頭文件兩次嗎? – 2010-10-12 02:15:14

+0

這段代碼沒有錯。編譯器錯誤究竟是什麼?您的頭文件是否包含多次?它是否有適當的包容警衛? – 2010-10-12 02:16:12

+0

是的,我確實有保安。編輯了 – domlao 2010-10-12 02:16:14

回答

3

正如在評論中指出,如果你使用的是C編譯器,而不是C++編譯器來編譯代碼,那麼你難免會顯示錯誤。該代碼僅在C++中有效,因此您必須使用C++編譯器進行編譯。此外,如果您使用的是C編譯器,則無法使用限定名稱(例如「FG::black」或「BG::black」)來消除名稱歧義; C不認可雙冒號作爲有效符號。


從下面的評論:

Actually the problem is in another file; my C file includes the header file, which is the header contains a C++ code file, so that is the cause of the problem. So my header file (foo.h) contains a valid code. Could you suggest a structure for C header file?

如果你需要你的頭了foo.h是在C和C++雙語,你可能會做最好的一個枚舉,失去了必要「FG ::黑」和「BG ::黑」完全預選賽:

#ifndef FOO_H_INCLUDED 
#define FOO_H_INCLUDED 

typedef enum Colour 
{ 
    black = 1, 
    red = 2, 
    green = 3 
} Colour; 

typedef struct FG 
{ 
    ... 
    Colour shade; 
    ... 
} FG; 

typedef struct BG 
{ 
    ... 
    Colour shade; 
    ... 
} BG; 

#endif // FOO_H_INCLUDED 

注意,需要的類型定義,以允許C代碼來指代「BG」,「FG」和「色彩」沒有前綴'struct'或'enum';純粹的C++根本不需要這些typedef。但是,您正在編寫雙語代碼,偶爾您必須以某種方式編寫代碼,這種方式似乎在某種語言中有些微不足道。

+0

謝謝,看來我的makefile中有問題。 – domlao 2010-10-12 02:39:08

+1

@sasayins:那麼也許你應該顯示makefile?還是編譯命令?什麼是您的C++源文件的擴展名?使用.cpp或.cxx或.C是常規的,但後者(.C)可能會與不區分大小寫的文件系統上的.c混淆。 – 2010-10-12 02:43:17

+0

非常感謝。其實問題出在另一個文件上,我的C文件包含頭文件,頭文件包含一個C++代碼文件,所以這是問題的原因。所以我的頭文件(foo。h)包含有效的代碼。你能建議一個C頭文件的結構嗎?謝謝 – domlao 2010-10-12 03:05:18