遇到一些奇怪的代码,它让我想知道是否有任何实际应用,或者它只是一个随机的奇怪。
代码基本上如下所示:
#ifdef PREPROCESSOR_CONDITION
if (runtime_condition) {
} else
#endif
{
//expression
}
我包含了宏位,但我怀疑它有什么影响。当runtime_condition为true时,没有代码运行,只有else块。我认为这应该与使用if(!runtime_condition)和no else block(本来会更直接)完全相同,但也许有某种编译器优化的事情发生了?
或者,你知道,可能是if块中的某些东西被删除了,没有人愿意改变表达。
答案 0 :(得分:2)
确保条件肯定始终有两个分支(在编译为条件的情况下)保证在始终定义PREPROCESSOR_CONDITION
的平台上工作的人不会心不在焉地在下面添加一个真正的else
块,这显然不是这个块应该如何工作(或者更糟糕的是,“修复”它以便它们的代码 在任何地方编译,但是在这个过程中损害了原作者在构建他们的块时的意图。)
如果这是意图,那么通过隐藏if-empty-else
的确切细节来明确地传达它通常是有意义的。UNLESS
在if (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
未定义之前不会公开。
这在单个代码段中可能看起来很小,但是如果出现在较大的项目中,则由于意外发生的编译错误(例如,在意外的地方发生代码中断)是一个重要的生产力问题。