警告 C4481 非标准扩展用于枚举 'MyEnum' 用于限定名称
Warning C4481 nonstandard extension used in enum 'MyEnum' used in qualified name
我正在尝试从我正在处理的 class 中删除警告。
警告如下:
Warning C4482: nonstandard extension used: enum 'MyEnum'
used in qualified name
我知道警告是由于尝试访问枚举中的值之一引起的,如下所示:
//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:
的情况
class MyClass
{
enum MyEnum
{
Value1,
Value2,
Value3
};
};
我不想将它移出 class,因为 class 为枚举提供了封装,但我也无法将枚举包装在命名空间中,因为命名空间不是在 class 声明中允许。在这种情况下是否有更好的方法来实现相同的行为 (MyEnum::Value1) 而不会引发相同的警告?
仅供参考:我仅限于 vc10 允许的实现。
我不相信标准 C 中有任何 :: 运算符,因此即使在结构中,枚举值也很可能只是全局符号。将它放在结构 class 或命名空间中,如您在 C++ 中所示,可以使用该运算符访问它。
从 C++11 开始,通过枚举名称限定枚举数是标准 C++。
在此之前,您无法用标准 C++ 编写 MyEnum::Value1
。然而,微软甚至在标准化之前就允许它作为扩展。
VC10 警告您,您的资质使用的是扩展而非标准。如果内存服务 C++11 不是 VC10 使用的默认标准。
因为这是一个 C 头文件,并且枚举器名称始终是封闭范围的成员,所以您别无选择,只能 "qualifying" 它们以 C 方式
enum MyEnum {
MyEnum_Value1
};
我正在尝试从我正在处理的 class 中删除警告。
警告如下:
Warning C4482: nonstandard extension used: enum 'MyEnum' used in qualified name
我知道警告是由于尝试访问枚举中的值之一引起的,如下所示:
//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:
的情况class MyClass
{
enum MyEnum
{
Value1,
Value2,
Value3
};
};
我不想将它移出 class,因为 class 为枚举提供了封装,但我也无法将枚举包装在命名空间中,因为命名空间不是在 class 声明中允许。在这种情况下是否有更好的方法来实现相同的行为 (MyEnum::Value1) 而不会引发相同的警告?
仅供参考:我仅限于 vc10 允许的实现。
我不相信标准 C 中有任何 :: 运算符,因此即使在结构中,枚举值也很可能只是全局符号。将它放在结构 class 或命名空间中,如您在 C++ 中所示,可以使用该运算符访问它。
从 C++11 开始,通过枚举名称限定枚举数是标准 C++。
在此之前,您无法用标准 C++ 编写 MyEnum::Value1
。然而,微软甚至在标准化之前就允许它作为扩展。
VC10 警告您,您的资质使用的是扩展而非标准。如果内存服务 C++11 不是 VC10 使用的默认标准。
因为这是一个 C 头文件,并且枚举器名称始终是封闭范围的成员,所以您别无选择,只能 "qualifying" 它们以 C 方式
enum MyEnum {
MyEnum_Value1
};