在3.0.4 Linux内核中,mm/filemap.c有这行代码:
retval = retval ?: desc.error;
我已经尝试用gcc -Wall编译一个类似的最小测试用例,并且没有得到任何警告; 行为似乎与:
retval = retval ? retval : desc.error;
看看C99标准,我无法弄清楚正式描述这种行为的原因.为什么这样好?
zwo*_*wol 36
正如其他几位人士所说,这是GCC扩展,不属于任何标准.如果使用-pedantic开关,您将收到警告.
该点这个扩展是不是在这种情况下确实明显,但想象一下,如果相反,它是
retval = foo() ?: desc.error;
随着扩展,foo()只被调用一次.没有它,你必须引入一个临时变量来避免调用foo()两次.
Dav*_*ven 19
这是一个gcc扩展.x ?: y等同于x ? x : y---见http://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals.
是的,我认为这也是邪恶的.