#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/