c++ - 为什么编译器不提示错误的枚举值

标签 c++

#include <iostream>

enum IsOptionAEnum
{
    IsOptionA_YES,
    IsOptionA_NO
};

enum IsOptionBEnum
{
    IsOptionB_YES,
    IsOptionB_NO
};

void TestFunc(IsOptionAEnum optionA, IsOptionBEnum optionB)
{
    if (optionA == IsOptionA_YES || optionA == IsOptionB_YES) // typo
    {
        // ...
    }

    //if (optionA == IsOptionA_YES || optionB == IsOptionB_YES) // correct one
    //{
    //}

}

问题> optionA 的类型为 IsOptionAEnum,并且没有 IsOptionB_YES 的值。为什么VS2010的编译器没有发现这个错误?

如果是编译器找不到错误的情况,有没有办法强制执行此限制,以便编译器可以找到错误?

最佳答案

虽然标准不会将此呈现为错误(枚举实际上是整数的语法),但编译器肯定可以检测到这一点。 Clang , 用 -Wenum-compare 编译,给出:

Bonsai:~ adamw$ clang++ test.cpp 
    test.cpp:15:45: warning: comparison of two values with different enumeration
      types ('IsOptionAEnum' and 'IsOptionBEnum') [-Wenum-compare]
    if (optionA == IsOptionA_YES || optionA == IsOptionB_YES) // typo
                                    ~~~~~~~ ^  ~~~~~~~~~~~~~

默认情况下,Visual C++ 可能不会对此发出警告。尝试在编译器上设置 /Wall 标志,这将启用所有警告。如果仍然没有警告,您可以向 VC 编译器团队提出请求。

编辑:正如其他答案和评论所提到的,如果您有 VC11,则可以使用 Strongly typed enums .

关于c++ - 为什么编译器不提示错误的枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14690607/

相关文章:

c++ - 使用四元数的 OpenGL 立方体旋转

c++ - 为类模板的特定嵌套类实现非成员泛型函数

c++ - 最低答案 C++

c++ - ffmpeg sws_scale 得到了从 YUV420P 到 RGB24 的失真图像

c++ - 在第二个节点解析嵌套的 yml 文件

c++ - 找到第二个最小值

C++ 入门问题

c++ - 预处理器如何处理宏?

c++ - 在回调中将 shared_ptr 转换为 void*