警告以限定名称使用的枚举“ MyEnum”中使用的C4481非标准扩展名

时间:2019-02-04 03:06:32

标签: c++ vc10

我正在尝试从正在研究的课程中删除警告。

警告如下:

  

警告C4482:使用的非标准扩展名:枚举'MyEnum'   以专有名称使用

我知道警告是由于尝试访问枚举中的值之一引起的,如下所示:

//Declared in a C header file.
enum MyEnum
{
    Value1,
    Value2,
    Value3 
};

//Exists in some other .cpp file.
void SomeFunc()
{
    MyEnum::Value1; //Generates warning C4482
}

仅供参考:SomeFunc()存在于.cpp文件中,但枚举在C头文件中声明。

所以我可以删除警告的一种方法是将MyEnum :: Value1替换为Value1。但是,我宁愿使用MyEnum :: Value1枚举值,因为我希望它更明确。

因此,如果我仅使用C ++,则可以这样更改枚举:

namespace MyEnum
{
    enum 
    {
        Value1,
        Value2,
        Value3 
    };
}

但是,枚举存在于C头文件中,因此我无法将枚举包装在命名空间中。我也无法将枚举移到C ++头文件中,因为其他文件已经依赖于枚举。

我考虑的一种方法是将枚举包装在结构中:

struct MyEnum
{
   enum Type
   { 
       Value1,
       Value2,
       Value3
   };
 };

这将允许我使用MyEnum :: Value1访问值而不会发出警告。

但是,有没有更好的方法来实现这一目标?

此外,我还遇到过枚举存在于C ++文件中,但范围仅限于一个类的情况:

class MyClass
{
    enum MyEnum
    {
        Value1,
        Value2,
        Value3
    };
};

我不想将其移出类,因为该类提供了枚举的封装,但是我也不能将枚举包装在名称空间中,因为类声明中不允许使用名称空间。在这种情况下是否有更好的方法来实现相同的行为(MyEnum :: Value1),而不会发出相同的警告?

FYI2:我仅限于vc10允许的实现。

2 个答案:

答案 0 :(得分:3)

我不认为标准C中有任何::运算符,因此即使在struct中,枚举值也很可能只是全局符号。将其放在C ++中的结构,类或命名空间中,就可以使用该运算符对其进行访问。

答案 1 :(得分:2)

仅从C ++ 11开始,使用枚举名称限定枚举器才是标准C ++。

在此之前,您无法在标准C ++中编写MyEnum::Value1。但是,微软甚至在标准化之前就允许它作为扩展。

VC10警告您,您的资格正在使用扩展,而不是标准的扩展。如果内存服务C ++ 11不是VC10使用的默认标准。

由于这是C头,并且枚举数始终是封闭范围的成员,因此您无权使用C方式对它们进行“限定”

enum MyEnum { 
    MyEnum_Value1
};