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.
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.