In the 3.0.4 Linux kernel, mm/filemap.c has this line of code:
retval = retval ?: desc.error;
I\'ve tried compiling a similar minimal test
As several others have said, this is a GCC extension, not part of any standard. You'll get a warning for it if you use the -pedantic
switch.
The point of this extension is not really visible in this case, but imagine if instead it was
retval = foo() ?: desc.error;
With the extension, foo()
is called only once. Without it, you have to introduce a temporary variable to avoid calling foo()
twice.
It's a gcc extension. x ?: y
is equivalent to x ? x : y
--- see http://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals.
Yes, I think it's evil too.
This is a GCC extension called Conditionals with Omitted Operands. Omitting the middle operand has the effect of using the value of the conditional as the omitted operand without evaluating it again. It is safe to use even if the conditional is a macro.
This is a gcc-specific extension to C and is not standard.