![](/img/trans.png)
[英]Is there any alternative to using if walls instead of something else in C++?
[英]c/c++ using else instead of if not
遇到了一些看起来很奇怪的代码,这让我想知道它是否有任何实际应用,还是只是一个随机的怪癖。
该代码基本上如下所示:
#ifdef PREPROCESSOR_CONDITION
if (runtime_condition) {
} else
#endif
{
//expression
}
我包括了宏位,尽管我怀疑它是否有影响。 当runtime_condition为true时,没有任何代码可以运行,只有else块。 我认为这应该与使用if(!runtime_condition)完全相同,并且不使用else块(本来会更简单),但是也许正在发生某种编译器优化的事情?
或者,您知道,可能是if块中曾经有一些东西被删除,没有人愿意更改表达式。
保证条件肯定总是有两个分支(就当它被编译为条件的场合)保证的人谁总是有一个平台上工作PREPROCESSOR_CONDITION
定义不会心不在焉地添加一个真正else
下面的框,其中明确ISN”该块应该如何工作(或更糟糕的是,“修复”它,以使它们的代码可以在任何地方编译,但是在此过程中,无论原始作者以何种方式构造其块,都将对其造成损害)。
如果是这样的话,通常可以通过将if-empty-else
的确切细节隐藏在名为UNLESS
类的宏后面来进行显式通信。
绝对与优化无关。 如果您考虑所涉及的跳转,则编译器已经必须将谓词的值取反,以决定是否跳过该块(即if (A) {B;} C:...
的确意味着if (!A) goto C; B; C:...
),这意味着它会折叠手写的!
无论如何,在表达式最外层的条件结构中; 由于大多数指令集都会提供“ 如果真”和“ 如果不是真”指令,则这样做是完全免费的,并且两种在源代码中写入“如果不是”的方法甚至会在非常小的情况下产生相同的机器代码。简单的编译器,无需任何优化。
“宏位”很重要。
考虑如果程序员错误地将代码段更改为
#ifdef PREPROCESSOR_CONDITION
if (runtime_condition)
{
}
else
#endif
{
//expression
}
else
{
// another expression
}
无论是否定义了PREPROCESSOR_CONDITION
,都将导致编译错误。
随着您的更改,即;
#ifdef PREPROCESSOR_CONDITION
if (!runtime_condition)
#endif
{
//expression
}
else
{
// another expression
}
如果定义了PREPROCESSOR_CONDITION
,它将编译,但是如果没有定义,它将失败。
如果添加else
的程序员仅在定义了PREPROCESSOR_CONDITION
条件下尝试编译,则不会发现问题。 这样,代码中将存在潜在的缺陷,直到使用未定义的PREPROCESSOR_CONDITION
编译代码后, PREPROCESSOR_CONDITION
才会暴露出来。
在单个代码段中,这似乎很小,但是如果在较大的项目中发生意外编译错误(例如,代码在意外地方中断),则将是一个很大的生产率问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.