我在自己的命名空间中有一些枚举,但是我仍然收到关于“全局命名空间中的污染”的恼人警告。为什么我会收到这个错误,因为它们甚至不在全局命名空间中?我怎样才能摆脱这个警告呢?确切的警告是:
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; };
}
我也尝试过使用枚举类,但我不想在这种情况下使用它们,因为它会破坏一切,而且我必须在所有地方使用静态强制转换,这将是一个混乱。我真的很感激帮助处理这个恼人的警告。
谢谢:)
2条答案
按热度按时间ztyzrc3y1#
MSVC警告C26812不是来自C/C编译器,而是来自静态代码分析(
/analyze
)功能,特别是来自C++ Core Guidelines Checker。检查器告诉你的“推荐解决方案”是使用C11强类型枚举。也就是说,你可以取消警告,因为 *C++核心指南 * 只是推荐。
如果需要,您还可以通过Microsoft Docs上提到的UI创建自定义规则集,但是大多数其他规则都是合理的,所以我发现单个警告抑制是最简单的方法。
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