4
#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
    //{
    //}

}

Question>optionA是 typeIsOptionAEnum并且没有IsOptionB_YES. 为什么VS2010的编译器没有发现这个错误?

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

4

3 回答 3

5

在 C++11 之前,枚举类型不提供您正在寻找的类型安全性,并且本质上是漂亮的整数。

你想要强类型枚举类:
http ://www.cprogramming.com/c++11/c++11-nullptr-strongly-typed-enum-class.html

于 2013-02-04T16:12:35.800 回答
5

虽然标准不会将此视为错误(枚举实际上是整数的语法),但这肯定是编译器可以检测到的。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

于 2013-02-04T16:13:24.520 回答
1

非 C++11 的解决方案是使用structs

struct IsOptionAEnum
{
    int val;
    static IsOptionAEnum IsOptionA_YES;
    static IsOptionAEnum IsOptionA_NO;

    IsOptionAEnum( int v ): val(v) {}
};

IsOptionAEnum::IsOptionA_YES(0);
IsOptionAEnum::IsOptionA_YES(1);

if( optionA == IsOptionAEnum::IsOptionA_YES ) // this is type-safe
    // etc.

如果不需要,可以删除内部值(您需要禁用复制,始终通过引用传递并比较结构的地址)。

在 C++11 中,您可以使用Prashant 建议的类型化枚举。

于 2013-02-04T16:19:37.317 回答