37 votes

Bizarre l'utilisation de l'opérateur conditionnel dans Linux

Dans la 3.0.4 noyau Linux, mm/filemap.c est cette ligne de code:

retval = retval ?: desc.error;

J'ai essayé de compiler un semblable minimal de cas de test avec gcc -Wall et n'obtenez pas de mises en garde; le problème semble identique à:

retval = retval ? retval : desc.error;

En regardant le standard C99, je ne peux pas comprendre ce qui formellement décrit ce comportement. Pourquoi est-ce OK?

36voto

Zack Points 44583

Comme plusieurs autres l'ont dit, c'est un GCC extension, ne fait partie d'aucun standard. Vous recevez un avertissement si vous utilisez l' -pedantic de l'interrupteur.

Le point de cette extension n'est pas vraiment visible dans ce cas, mais imaginez si au lieu de cela il a été

retval = foo() ?: desc.error;

Avec l'extension, foo() est appelée qu'une seule fois. Sans cela, vous devez introduire une variable temporaire pour éviter d'attirer l' foo() deux fois.

19voto

David Given Points 4935

C'est un gcc extension. x ?: y est équivalent à x ? x : y --- voir http://gcc.gnu.org/onlinedocs/gcc/Conditionals.html#Conditionals.

Oui, je pense que c'est mal aussi.

7voto

David Schwartz Points 70129

C'est un GCC extension appelée Conditionnelles avec Omis Opérandes. En omettant le milieu opérande est l'effet de l'utilisation de la valeur de la condition, comme l'a omis opérande sans l'évaluer à nouveau. Il est sûr à utiliser, même si la condition est une macro.

3voto

Greg Hewgill Points 356191

C'est un gcc-extension spécifique à C et n'est pas standard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X