我该如何重写该代码,以使用户始终在通过有效方向时始终看到正确的状态(CA,AL等)字符串。

即我如何确保在编译时而不是在运行时为enum方向中的每个enum_types提供有效的case语句?

为了。例如。我有意地评论了关于东方的案情陈述。有没有一种方法可以在编译时捕获它。

我的直觉是(否)这就是为什么该语言提供默认情况的原因,因此这可能是不可能的。但是,我将留给专家。

#include <iostream>
#include <string>

using namespace::std;

typedef enum
{
    min_dir = -1,
    north,
    south,
    east,
    west,
}directions;

directions get_direction( string user_choice)
{
    if(user_choice == "north")
    {
        return north;
    }
    else if (user_choice == "south")
    {
        return south;
    }
    else if (user_choice == "east")
    {
        return east;
    }
    else if (user_choice == "west")
    {
        return west;
    }
    else
    {
        return min_dir;
    }
}

int main()
{
    string user_direction;
    cout << "Enter direction\n";
    cin >> user_direction;

    directions my_dir = get_direction(user_direction);
    cout << " Print direction's description\n";

    if( my_dir == min_dir)
    {
        // User passed junk
        return -1;
    }

    switch(my_dir)
    {
    case north:
        cout << "North - New york\n";break;
    case south:
        cout << "South - Alabama\n";break;
//  case east:
//      cout << "East - North Carolina\n";break;
    case west:
        cout << "West - California\n";break;
    default:
        cout << "Should Ideally never get here\n";break;
    }
    system("pause");
    return 0;
}

编辑:
这仅仅是说明这一点的一个例子。这适用于工作中的代码。他们已经在Windows(MSVC)和linux(gcc)中对此进行了编译。这仅仅是警告吗?我需要更严格的执行。

如果枚举没有case语句,我可以编写一些在make过程中会出错的代码吗?

最佳答案

在GCC(g++)和Clang中,有-Wswitch-enum,如果您没有case可能会为您的enum类型的switch类型提供可能的值(即使您有default大小写),也会警告您。

在MSVC中,有一个类似的C4062来自警告级别3,但是如果您有default语句,它不会警告您。如果在这种情况下需要警告,则需要启用4级警告C4061,即使缺少默认值,该枚举也会在缺少枚举值时产生警告。

就其产生的错误而言:所有编译器都具有“将警告视为错误”选项。在GCC和Clang中,它是-Werror;在MSVC中,它是/WX

10-08 08:20
查看更多