为了账号安全,请及时绑定邮箱和手机立即绑定

转发在C ++中声明一个枚举

转发在C ++中声明一个枚举

C++
12345678_0001 2019-08-09 17:50:40
转发在C ++中声明一个枚举我正在尝试做类似以下的事情:enum E;void Foo(E e);enum E {A, B, C};编译器拒绝的。我已经快速浏览了一下Google,而且共识似乎是“你做不到”,但我无法理解为什么。谁能解释一下?澄清2:我这样做是因为我在类中使用私有方法来获取枚举,并且我不希望枚举枚举值 - 例如,我不希望任何人知道E被定义为enum E {     FUNCTIONALITY_NORMAL, FUNCTIONALITY_RESTRICTED, FUNCTIONALITY_FOR_PROJECT_X}因为项目X不是我希望用户了解的东西。所以,我想转发声明枚举,以便我可以将私有方法放在头文件中,在cpp内部声明枚举,并将构建的库文件和标题分发给人。至于编译器 - 它是GCC。
查看完整描述

3 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

在C ++ 0x中也可以进行枚举的前向声明。以前,枚举类型无法向前声明的原因是因为枚举的大小取决于其内容。只要枚举的大小由应用程序指定,就可以向前声明:


enum Enum1;                   //Illegal in C++ and C++0x; no size is explicitly specified.

enum Enum2 : unsigned int;    //Legal in C++0x.

enum class Enum3;             //Legal in C++0x, because enum class declarations have a default type of "int".

enum class Enum4: unsigned int; //Legal C++0x.

enum Enum2 : unsigned short;  //Illegal in C++0x, because Enum2 was previously declared with a different type.


查看完整回答
反对 回复 2019-08-09
?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

鉴于最近的发展,我在这里添加了一个最新的答案。

您可以在C ++ 11中转发声明枚举,只要您同时声明其存储类型即可。语法如下所示:

enum E : short;void foo(E e);....enum E : short{
    VALUE_1,
    VALUE_2,
    ....}

实际上,如果函数永远不会引用枚举的值,那么此时您根本不需要完整的声明。

G ++ 4.6及更高版本(-std=c++0x-std=c++11更新版本)支持此功能。Visual C ++ 2013支持这一点; 在早期版本中它有一些我尚未想到的非标准支持 - 我发现一些简单的前向声明是合法的,但是YMMV。


查看完整回答
反对 回复 2019-08-09
  • 3 回答
  • 0 关注
  • 554 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信