问题描述
在3.0.4 Linux内核中,MM/Filemap.c具有此代码线:
retval = retval ?: desc.error;
我尝试用GCC -Wall编译类似的最小测试用例,但不要收到任何警告;这种行为似乎与:
相同retval = retval ? retval : desc.error;
查看C99标准,我无法弄清楚什么正式描述了这种行为.为什么还可以?
推荐答案
正如其他几个人所说的那样,这是GCC扩展,而不是任何标准的一部分.如果您使用-pedantic开关,您将获得警告.
在这种情况下,此扩展的点并不是真正可见的,但是想象一下是否是
retval = foo() ?: desc.error;
使用扩展名,foo()仅称为一次.没有它,您必须引入一个临时变量,以避免两次调用foo().
其他推荐答案
这是GCC扩展. x ?: y等于x ? x : y ----参见 http://gcc. gnu.org/onlinedocs/gcc/conditionals.html#conditionals .
是的,我认为这也是邪恶的.
其他推荐答案
这是一个GCC扩展名,称为条件省略操作数.省略中间操作数的效果是将条件的值作为省略的操作数,而无需再次对其进行评估.即使条件是宏也可以安全使用.