【问题标题】:How to suppress unscoped enum warning in custom namespace?如何抑制自定义命名空间中的无范围枚举警告?
【发布时间】:2022-12-10 13:44:13
【问题描述】:

我在自己的命名空间中有一些枚举,但我仍然收到关于“全局命名空间中的污染”的恼人警告。为什么我会收到此错误,因为它们甚至不在全局命名空间中?我怎样才能摆脱这个警告?确切的警告是:

C26812, The enum type 'Adventure_Game::itemType' is unscoped. Prefer 'enum class' over 'enum' (Enum.3).

我在头文件中的命名空间中有枚举声明,如下所示:

namespace Adventure_Game {

    enum itemType { Consumable, Key };
    enum equipType { Unarmed, Weapon, Shield, Armor };

    struct invItem { string name = "(name)", desc = "(desc)"; itemType type; unsigned int amount = 0; float value = 0.0f; };
    struct invEquip { string name = "(name)", desc = "(desc)"; equipType type; float low = 0.0f, high = 1.0f, weight = 0.0f, value = 0.0f; bool equip = false; };

}

我也尝试过使用枚举类,但我不想在这种情况下使用它们,因为它会破坏一切,而且我必须在任何地方都使用静态转换,这只会是一团糟。我真的很感激帮助处理这个烦人的警告。

谢谢 :)

【问题讨论】:

    标签: c++ visual-studio-2019


    【解决方案1】:

    MSVC 警告 C26812 不是来自 C/C++ 编译器。它来自静态代码分析 (/analyze) 功能,特别是来自 C++ Core Guidelines Checker

    检查器告诉您的“推荐解决方案”是使用 C++11 强类型枚举。也就是说,您可以将警告抑制为C++ 核心指南只是建议。

    #pragma warning(disable : 4619 4616 26812)
    // C4619/4616 #pragma warning warnings
    // 26812: The enum type 'x' is unscoped. Prefer 'enum class' over 'enum' (Enum.3).
    

    如果需要,您还可以通过 Microsoft Docs 中提到的 UI 创建自定义规则集,但大多数其他规则都是合理的,因此我发现单一警告抑制是最简单的途径。

    【讨论】:

      【解决方案2】:

      通过使用 enum class 而不是仅仅使用 enum 来使代码的类型更强。普通枚举更容易出错,因为枚举数可以轻松转换为 int

      见:https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#enum3-prefer-class-enums-over-plain-enums

      【讨论】: