在3.0.4 Linux内核中,mm/filemap.c包含以下代码行:
retval = retval ?: desc.error;我曾尝试用gcc -Wall编译一个类似的最小测试用例,没有得到任何警告;其行为似乎与以下行为相同:
retval = retval ? retval : desc.error;看看C99标准,我想不出是什么正式地描述了这种行为。为什么这是可以的?
发布于 2011-10-19 06:56:32
正如其他几个人所说,这是一个GCC的扩展,不是任何标准的一部分。如果您使用-pedantic开关,您将收到一条警告。
在这种情况下,这个扩展的意义并不明显,但是想象一下,如果它是
retval = foo() ?: desc.error;使用扩展时,foo()只调用一次。如果没有它,您必须引入一个临时变量来避免两次调用foo()。
发布于 2011-10-19 06:49:14
这是gcc的分机。x ?: y等同于x ? x : y -参见http://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals。
是的,我也认为这是邪恶的。
发布于 2011-10-19 06:49:09
这是一个叫做Conditionals with Omitted Operands的GCC扩展。省略中间操作数的效果是将条件的值用作省略的操作数,而无需再次计算它。即使条件是宏,使用它也是安全的。
https://stackoverflow.com/questions/7814694
复制相似问题