c – 在编译期间是否可以错误检查case语句选项?
作者:互联网
如何以这样的方式重写此代码:只要用户通过有效方向,就会始终显示正确的状态(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;
}
编辑:
这只是一个例子来说明这一点.这是代码在工作.他们在Windows(MSVC)和linux(gcc)中都编译了这个.这只是一个警告吗?我需要更严格的执法.
如果枚举没有case语句,我可以编写一些在make过程中会出错的代码吗?
解决方法:
在GCC(g)和Clang中,有-Wswitch-enum,如果你没有关于你要切换的枚举类型的可能值的情况(即使你有默认情况),它会发出警告.
在MSVC中,可比较的C4062来自警告级别3,但如果您有默认语句,它不会警告您.如果在这种情况下需要警告,则需要启用级别4警告C4061,即使缺少枚举值,也会生成警告,即使提供了默认情况.
至于使其成为错误:所有编译器都有“将警告视为错误”选项.在GCC和Clang中,它是 – 错误的;在MSVC中,它是/ WX.
标签:c,compile-time,switch-statement,runtime 来源: https://codeday.me/bug/20190826/1725558.html