【发布时间】:2011-02-17 20:58:28
【问题描述】:
在 Android 开源 qemu 代码中我遇到了这行代码:
machine->max_cpus = machine->max_cpus ?: 1; /* Default to UP */
这只是一种令人困惑的说法吗:
if (machine->max_cpus) {
; //do nothing
} else {
machine->max_cpus = 1;
}
如果是这样,不是更清楚吗:
if (machine->max_cpus == 0) machine->max_cpus = 1;
有趣的是,这可以在 gcc 上编译并正常工作,但不能在 http://www.comeaucomputing.com/tryitout/ 上编译。
【问题讨论】:
-
等等,什么?! ……这对我来说似乎是一个错误。
-
@Konrad - 可能不是。评论建议该行设置默认值 - 如果“max_cpus 未设置,请设置默认值”。
-
如果它是合法的,我会避免它,因为它看起来太像它可能是一个错误。在这里我们进行了一次大讨论,证明使用 if 语句会更清楚。
-
@Konrad:不。在大型特定于编译器的代码库中,您几乎不会用“这是一个扩展”来评论扩展的每一次使用。诚然,与
__builtin_clz或(在 C++ 中)long long相比,这对于读者来说是一个特别棘手的问题。 -
“会不会更清楚”。是的。但如果是
machine->max_cpus = arguments->max_cpus ?: 1;,可能就没有那么多了。可能是过度使用在某些情况下可以正常工作但在其他情况下不行的习语的结果。
标签: c gcc android-emulator conditional-operator qemu