c++ - 是否可以在编译时错误检查 case 语句选项?

标签 c++ runtime switch-statement compile-time

我如何重写此代码,以便用户在经过有效方向时始终显示正确的状态(CA、AL 等)字符串。

即如何确保在编译时和运行时枚举方向中的每个枚举类型都有一个有效的 case 语句?

为了。例如。我有意注释掉了 east 的案例陈述。有没有办法在编译时捕获它。

我的直觉是(否)这就是语言提供默认大小写的原因,因此这可能是不可能的。但我会将其留给专家。

#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 case)。

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

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

关于c++ - 是否可以在编译时错误检查 case 语句选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13354532/

相关文章:

c++ - 模板循环需要 const 值

java - 由 Runtime exec 运行时的外部程序 block

java - 关于 Java 访问说明符绑定(bind)

c# - 如何提高我的 ECMAScript 实现的递归能力?

c++ - NormalTexture 在 Wavefront 资源 Material 格式中如何表示?

c++ - 如何在 C++ 中将 int 连接到 wchar_t*?

C++:在多态单例类上重载删除

c++ - C++中的切换案例无限循环错误

c++ - 变量总是在函数中重置为默认值

java - 如何将 ENUM 与 SWITCH 结合使用,进行基于字符串的比较