重新声明普查员

时间:2010-10-12 02:13:21

标签: c++

我收到错误:编译代码时重新声明枚举器消息,请从我的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 个答案:

答案 0 :(得分:3)

如评论中所述,如果您使用C编译器而不是C ++编译器来编译代码,那么您将不可避免地得到显示的错误。该代码仅在C ++中有效,因此必须使用C ++编译器进行编译。

此外,如果您使用的是C编译器,则无法使用“FG::black”或“BG::black”等限定名称来消除名称歧义; C不会将双冒号识别为有效符号。


来自以下评论:

  

实际上问题出现在另一个文件中;我的C文件包含头文件,该头文件包含一个C ++代码文件,因此这就是问题的原因。所以我的头文件(foo.h)包含一个有效的代码。你能为C头文件建议一个结构吗?

如果你需要你的头文件foo.h在C和C ++中使用双语,你可能最好只使用一次枚举,完全不需要'FG :: black'和'BG :: black'限定符:

#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

请注意,需要typedef来允许C代码引用'BG','FG'和'Color'而不带前缀'struct'或'enum';纯C ++根本不需要那些typedef。但是,您正在编写双语代码,有时候您必须以一种似乎在一种或另一种语言中稍微倾斜的方式编写。