c++ 如何在自定义命名空间中抑制无作用域枚举警告?

pkln4tw6  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(215)

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

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; };

}

我也尝试过使用枚举类,但我不想在这种情况下使用它们,因为它会破坏一切,而且我必须在所有地方使用静态强制转换,这将是一个混乱。我真的很感激帮助处理这个恼人的警告。
谢谢:)

ztyzrc3y

ztyzrc3y1#

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创建自定义规则集,但是大多数其他规则都是合理的,所以我发现单个警告抑制是最简单的方法。

nwo49xxi

nwo49xxi2#

通过使用enum class(而不仅仅是enum)使代码具有更强的类型化。普通枚举更容易出错,因为枚举数可以很容易地转换为int
参见:https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#enum3-prefer-class-enums-over-plain-enums
https://www.nextptr.com/tutorial/ta1423015134/scoped-class-enums-fundamentals-and-examples

相关问题