Comparaîson étrange
[ Nouvelle discussion
| Répondre au groupe
|
fr.comp.lang.c ]
Sujet: Comparaîson étrange
De: thomas.nem...@betatech.invalid (Thomas Nemeth)
Groupes: fr.comp.lang.c
Organisation: BETAtech
Date: 01. Apr 2008, 12:04:48
|
Bonjour à tous et excusez-moi de vous sortir de vos
comparaîsons Python/Ruby/Java/whatever ;)
Je viens de lire un article très intéressant à propos de la conception
d'API (http://ozlabs.org/~rusty/index.cgi/tech/2008-03-30.html pour
ceux que ça intéresserait) mettant des mots sur ce qu'on pratique et
voit régulièrement. J'y suis tombé sur un exemple qui me laisse
perplexe :
---8<------------------------------------
The classic of this school is the Linux kernel min() and max() macros,
which use two GCC extensions: a statement expression which allows the
whole statement to be treated by the caller as a single expression, and
typeof which lets us declare a temporary variable of same type as
another:
/*
* min()/max() macros that also do
* strict type-checking.. See the
* "unnecessary" pointer comparison.
*/
#define min(x,y) ({ \
typeof(x) _x = (x); \
typeof(y) _y = (y); \
(void) (&_x == &_y); \
_x < _y ? _x : _y; })
Since a common error in C is to compare signed vs unsigned types and
expect a signed result, this macro insists that both types be identical.
---8<------------------------------------
Cette macro me pose 2 problèmes dont j'ai déduit la réponse à l'un
d'eux.
Tout d'abord, comme pointé dans le commentaire, pourquoi comparer
les _adresses_ des 2 variables temporaires ? Je comprends qu'on puisse
vouloir faire qu'une comparaîson échoue si 2 types sont différents
mais pour les adresses, je ne comprends pas. Un effet de bord du
compilateur ?
Enfin, c'est la forme que prend cette macro : ({...}). C'est une
construction que je n'avais pas vu (ou à laquelle je n'avais pas
prêté attention) avant. Les accolades sont, bien entendu, nécessaire
pour créer un bloc avec des variables dedans et les parenthèses sont
là pour "créer" une expression qui retournera une valeur. J'en
conclu que, la valeur retournée devant être celle de l'expression
c?a:b, le bloc "retournait" cette expression.
Est-ce un effet de bord du compilateur ?
Comment un bloc sans "return" peut-il renvoyer une valeur ?
Est-ce utilisable avec n'importe quelle autre expression ?
Thomas.

|
 cette fonctionnalité est reservée aux membres ayant une session active !
|