【问题标题】:Warning C4481 nonstandard extension used in enum 'MyEnum' used in qualified name警告 C4481 在限定名称中使用的枚举“MyEnum”中使用了非标准扩展
【发布时间】:2019-06-27 19:32:45
【问题描述】:

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

警告如下:

警告 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) 而不会发出相同的警告?

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

【问题讨论】:

  • 也许你可以在 C++ 中使用enum class MyEnum
  • 是的,我认为 enum 类可以在另一个类中使用,这对于第二种情况很好了解。但是我不确定vc10是否支持它,我必须检查一下并在发现时发布。
  • 我的发现表明 vc10 不支持枚举类,但仍然很高兴知道。

标签: c++ vc10


【解决方案1】:

仅从 C++11 开始,通过枚举名称限定枚举数是标准 C++。

在此之前,您不能在标准 C++ 中编写 MyEnum::Value1。然而,微软甚至在标准化之前就允许它作为扩展。

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

由于这是一个 C 标头,并且枚举器名称始终是封闭范围的成员,因此您别无选择,只能以 C 方式“限定”它们

enum MyEnum { 
    MyEnum_Value1
};

【讨论】:

  • 是的,我意识到这不是默认标准,因此警告是完全合理的,但我也无法升级到 vc14(遗留问题)。
【解决方案2】:

我不相信标准 C 中有任何 :: 运算符,因此即使在结构中,枚举值也很可能只是全局符号。在 C++ 中,将它放在结构、类或命名空间中,就像您展示的那样,它可以使用该运算符进行访问。

【讨论】:

  • 同意,如果我使用编译为 C 代码的文件中的枚举,我无法以这种方式引用枚举值。但是在使用 C++ 时,最好选择不引发警告。
  • 如果它在头文件中,它只有在编译引用它的源文件时才会被编译。我见过一些预处理器指令,您可以使用它来制作它,以便在 C++ 中使用它时将其包装在命名空间中,但我不确定是否有可移植的。
猜你喜欢
  • 2012-09-12
  • 2013-08-24
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多