是否有可能在编译期间错误检查case语句选项?

Kin*_*Jnr 3 c++ runtime switch-statement compile-time

如何以这样的方式重写此代码:只要用户通过有效方向,就会始终显示正确的状态(CA,AL等)字符串.

即如何确保编译时枚举方向中的每个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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:这只是一个例子来说明这一点.这是代码在工作.他们在Windows(MSVC)和linux(gcc)中都编译了这个.这只是一个警告吗?我需要更严格的执法.

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

Tra*_*kel 5

在GCC(g ++)和Clang中,-Wswitch-enum如果你没有caseenum你正在使用的类型设置一个可能的值switch(即使你有一个default案例),它会警告你.

在MSVC中,有类似的C4062来自警告级别3,但如果您有default声明,它不会警告您.如果在这种情况下需要警告,则需要启用级别4警告C4061,即使提供了默认情况,也会在缺少枚举值时生成警告.

至于使其成为错误:所有编译器都有"将警告视为错误"选项.在GCC和Clang中,它是-Werror; 在MSVC中,它是/WX.