情况是statement1 + statement2:编码不良

Is case statement1 + statement2: poor coding?

本文关键字:编码 不良 statement2 statement1 情况      更新时间:2023-10-16

我写了一个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;
}

与头文件中定义的语句:
#define statement1 999
#define statement2 32898
#define statement3 32899
#define statement4 32900

对我来说,这是提供更多的语句,而不需要定义更多的变量。允许我有不同的选项,这取决于在以前的代码中选择了什么语句。

社区如何看待这段代码?接受了吗?糟糕的实践?可避免的?

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

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

首先,在交换机中使用操作符并没有错。您可以使用任何类型的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;

如果你不想让它们出现在全局作用域中,你可以在你的函数中定义它们。

尽量避免使用#define。是的,这是一个不好的做法。

你可以用constexpr:

constexpr int statement1 = 2;

,你可以做完全相同的事情。但是你得到了更多的表达性和类型安全性。