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

Warning C4481 nonstandard extension used in enum 'MyEnum' used in qualified name

本文关键字:定名称 MyEnum 非标准 C4481 枚举 警告 扩展名      更新时间:2023-10-16

我正在尝试从我正在处理的类中删除警告。

警告如下:

警告C4482:使用了非标准扩展:enum"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)?

仅供参考:我仅限于vc10允许的实现。

自C++11以来,通过枚举名称限定枚举器是标准C++。

在此之前,您无法用标准C++编写MyEnum::Value1。然而,微软甚至在标准化之前就允许将其作为扩展。

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

由于这是一个C头,并且枚举器名称始终是封闭作用域的成员,所以您没有追索权,只能用C方式"限定"它们

enum MyEnum { 
MyEnum_Value1
};

我不相信标准C中有任何::运算符,所以即使在结构中,枚举值也很可能只是全局符号。在C++中,如果它位于结构、类或命名空间中,则可以使用该运算符访问它。