在Linux中奇怪地使用条件运算符

在3.0.4 Linux内核中,mm/filemap.c有以下代码行:

retval=retval?:描述错误;

我尝试过用gcc-Wall编译一个类似的最小测试用例,但没有得到任何警告;该行为似乎与以下行为相同:

retval=retval?retval:描述错误;

看看C99标准,我不知道什么形式上描述了这种行为。为什么这样可以

正如其他一些人所说,这是一个GCC扩展,不是任何标准的一部分。如果您使用-pedantic开关,将会收到警告

在本例中,此扩展的实际上不可见,但想象一下,如果它确实可见

retval=foo()?:desc.error;

使用扩展名,foo()只调用一次。没有它,您必须引入一个临时变量,以避免调用foo()两次

发表评论