63 votes

Quelle est la fonction de "(void) (&_min1 == &_min2)" dans la macro min de kernel.h ?

Sur kernel.h min est défini comme suit :

#define min(x, y) ({                \
    typeof(x) _min1 = (x);          \
    typeof(y) _min2 = (y);          \
    (void) (&_min1 == &_min2);      \
    _min1 < _min2 ? _min1 : _min2; })

Je ne comprends pas ce que la ligne (void) (&_min1 == &_min2); fait. C'est une sorte de vérification de type ou autre ?

0 votes

Curieux. Il me semble que la comparaison des adresses forcerait _min1 et _min2, et donc x et y, à être effectivement calculés et stockés, mais cela ne devrait-il pas se produire de toute façon lorsque _min1 est comparé à _min2 à la ligne suivante ?

0 votes

Pour info, la question Macro avec une ligne inhabituelle dans le noyau linux ? a été fusionné avec celui-ci, donc vous avez quelques nouvelles réponses maintenant.

0voto

R.. Points 93718

Le noyau Linux est rempli de ce genre de choses (hacks gratuits spécifiques à gcc au nom de la "sécurité des types" et autres considérations similaires), et je considère que c'est une très mauvaise pratique et je vous conseille vivement de ne pas la suivre à moins que quelqu'un ne vous y oblige.

pmg a raison sur le but du piratage, mais toute personne saine d'esprit définirait min comme ((x)<(y)?(x):(y)) .

Notez que la définition du noyau exclut de nombreuses utilisations correctes, par exemple lorsqu'un argument est int et un autre est long . Je soupçonne que ce qu'ils voulaient vraiment éviter, c'était les incompatibilités de signature, où par exemple min(-1,1U) est égal à 1. Une meilleure façon d'affirmer cela serait d'utiliser une assertion au moment de la compilation pour la variable ((1?-1:(x))<0)==((1?-1:(y))<0) . Notez que cela ne nécessite aucune modification spécifique à gcc.

4 votes

Mais ((x)<(y) ?(x) :(y)) est cassé si x ou y ont des effets secondaires. Pour être juste envers le noyau, ils ont spécifié GCC comme leur compilateur, donc ils sont autorisés à utiliser des trucs spécifiques à GCC.

1 votes

Tout le monde connaît on ne passe pas des expressions avec des effets secondaires à une macro min/max. C'est l'une des premières choses que l'on apprend en apprenant le C. Et spécifier GCC comme le seul compilateur supporté est une entrave au progrès.

4 votes

Bien sûr, mais je l'ai appris dans l'autre sens : on n'écrit pas min / max comme une macro comme ça.

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