当我编译我的代码时,我得到了一个错误:枚举器消息的重新声明,请从我的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发布于 2010-10-12 10:34:46
正如注释中所指出的,如果您使用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请注意,需要使用typedefs来允许C代码引用BG, FG和Colour不带前缀struct或者enum;纯C++根本不需要这些typedefs。然而,您正在编写双语代码,有时您必须以一种或另一种语言看起来有点生硬的方式编写代码。
https://stackoverflow.com/questions/3911226
复制相似问题