【发布时间】:2011-12-10 12:15:47
【问题描述】:
在3.0.4 Linux内核中,mm/filemap.c有这行代码:
retval = retval ?: desc.error;
我尝试使用 gcc -Wall 编译一个类似的最小测试用例,但没有收到任何警告;行为似乎与以下内容相同:
retval = retval ? retval : desc.error;
查看 C99 标准,我无法弄清楚是什么正式描述了这种行为。为什么会这样?
【问题讨论】:
-
谢谢,vhallac。据我所知,使用这个 GCC 扩展是一个很小的捷径,它完全破坏了可移植性。
-
正是我对一位试图在我们的一个项目中使用它的同事所说的。 :)
-
Bourne shell 不是也有这样的结构吗?
-
@ConradMeyer:在某些情况下,您可能是对的。然而,早期的 Linux 内核开发人员有意识地决定需要 gcc,而内核目前依赖于几个非 C99 扩展。有关内核依赖关系,请参阅 kernel.org/doc/Documentation/Changes,以及 en.wikipedia.org/wiki/Linux_kernel#Programming_languages。