是case statement1 + statement2:糟糕的编码?

问题描述:

我已经写了,看起来像这样的switch语句:是case statement1 + statement2:糟糕的编码?

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
这编译并工作正常使用visual studio 2003.

对我而言,这是提供更多的陈述而不需要定义更多的变量。根据之前的代码中选择的语句,允许我有不同的选项。

社区如何看待此代码?公认?不好的做法?避免的?

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

+0

规则是,案例标签基本上需要编译时数字常量。你问到的更多是个人风格问题,这是一个非常主观的问题,在这里不太适合。 –

+0

if-else语句对我来说似乎更好。 –

+2

@Someprogrammerdude哦,不,这是非常客观可怕的。(a)因为常量不是2个标志的权力,所以它们的加法不会产生唯一的值,并且(b)使它们变成宏而不是不变,这会导致名称污染。 –

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

首先,在开关中使用运算符没有错。你可以使用任何你想要的constexpr事物。对整数的操作是constexpr。

我会改变的事情是这样的:

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

我会用constexpr如果C++ 11是可用的。

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

除此之外,常数很难读懂,特别是那些名字。你可以在编译时使用constexpr函数产生这些常量的值,或者简单地给它们一个更好的名字并且可能对它进行注释。

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

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

您可以定义那些在您非常的功能,如果你不希望他们在全局范围内。

+0

像其他答案一样,这个数字常量的选择不好。 –

+0

我拿OP给我们的常量。我可以添加一些答案,可以说明这一点。 –

+0

我的观点是,这些常量是不好的,它们实际上是一个比使用宏更糟糕的问题,所以它们需要在一个完整的答案中处理。问题不在于常量很难阅读。他们**导致错误**,因为他们不是两个幂,所以不同的常量组合会导致相同的值。 –

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

您可以用constexpr做到这一点:

constexpr int statement1 = 2; 

,你可以做同样的事情。但你会得到更多的表现力和类型安全。

+0

但看到我的问题下的警告。使用'constexpr'只是必要变更的一部分。 –

+3

VC++ 2003不支持C++ 11。 – edmz

+0

@KonradRudolph:它确实,但不完全。 在一个开关中,你只能使用编译时常量,而你这样做。但作为主观意见,我会创建合并(element1 + element2)作为定义或constexpr以外的其他名称的开关,并在开关标签没有“+” – LeDYoM