case statement1 + statement2: 编码不好?

Is case statement1 + statement2: poor coding?

我写了一个如下所示的 switch 语句:

switch(statement){
    case statement1:
        break;
    case statement2:
        break;
    case statement3:
        break;
    case statement4:
        break;
    case statement1 + statement2:
        break;
    case statement1 + statement3:
        break;
    case statement1 + statement4:
        break;
    default:
        break;
}

使用 header 中定义的语句,如下所示:
#define statement1 999
#define statement2 32898
#define statement3 32899
#define statement4 32900
使用 visual studio 2003.

可以编译并正常工作

对我来说,这提供了更多的声明,而不需要定义更多的变量。根据先前代码中选择的语句,允许我有不同的选项。

社区如何看待这段代码?公认?不好的做法?可以避免吗?

我能看到的唯一风险是是否有定义 33897,33898,33899。

尽可能避免#define。是的,这是一种不好的做法。

你可以用 constexpr 做到这一点:

constexpr int statement1 = 2;

你也可以做同样的事情。但是你会获得更多的表现力和类型安全性。

嗯,虽然我不喜欢开关,但我认为你的代码可以改进很多。

首先,在开关中使用运算符并没有错。您可以使用任何类型的 constexpr 东西。整数运算是 constexpr。

我要改变的是:

const int statement1 = 999;
const int statement2 = 32898;
const int statement3 = 32899;
const int statement4 = 32900;

如果 c++11 可用,我会使用 constexpr

宏可以隐藏黑幕,比如函数调用和复杂的操作。现在它们是整数,可以在编译时使用。

此外,常量很难阅读,尤其是那些名字。您可以在编译时使用 constexpr 函数生成这些常量的值,或者简单地给它们一个更好的名称并可能对其进行注释。

在 switch 语句中将整数加在一起在实践中并不坏,但正如你所说,我能看到的唯一风险是是否有定义 33897、33898、33899。这就是为什么你应该赋予意义这些操作的结果。如果 33897 确实是你要测试的值,那么这样做:

const int combine2 = statement1 + statement2;
const int combine3 = statement1 + statement3;

如果您不想在全局范围内使用它们,您可以在您的函数中定义它们。