c / c ++使用else而不是if

时间:2016-11-18 23:23:39

标签: c++ c

遇到一些奇怪的代码,它让我想知道是否有任何实际应用,或者它只是一个随机的奇怪。

代码基本上如下所示:

#ifdef PREPROCESSOR_CONDITION
    if (runtime_condition) {
    } else
#endif
    {
        //expression
    }

我包含了宏位,但我怀疑它有什么影响。当runtime_condition为true时,没有代码运行,只有else块。我认为这应该与使用if(!runtime_condition)和no else block(本来会更直接)完全相同,但也许有某种编译器优化的事情发生了?

或者,你知道,可能是if块中的某些东西被删除了,没有人愿意改变表达。

2 个答案:

答案 0 :(得分:2)

确保条件肯定始终有两个分支(在编译为条件的情况下)保证在始终定义PREPROCESSOR_CONDITION的平台上工作的人不会心不在焉地在下面添加一个真正的else块,这显然不是这个块应该如何工作(或者更糟糕的是,“修复”它以便它们的代码 在任何地方编译,但是在这个过程中损害了原作者在构建他们的块时的意图。)

如果这是意图,那么通过隐藏if-empty-else的确切细节来明确地传达它通常是有意义的。UNLESSif (A) {B;} C:...之类的宏之后。

这绝对与优化无关。如果你考虑所涉及的跳转,编译器必须反转谓词的值来决定是否跳过该块(即if (!A) goto C; B; C:...实际上意味着!),这意味着它会折叠无论如何,在表达式最外层的手写customize menu and toolbars到条件结构中;因为大多数指令集都会提供 jump-if-true jump-if-not-true 指令,这样做是完全免费的,并且两种方式都可以写“如果没有“在源代码中,即使是非常简单的编译器也会产生相同的机器代码,而不进行任何优化。

答案 1 :(得分:2)

"宏位"很重要。

如果程序员错误地将代码段更改为

,请考虑会发生什么
#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未定义之前不会公开。

这在单个代码段中可能看起来很小,但是如果出现在较大的项目中,则由于意外发生的编译错误(例如,在意外的地方发生代码中断)是一个重要的生产力问题。