accès aux groupes de discussion, consultation et publication d'articles, recherche de "newsgroups"...
membres, identifiez-vous
é-mail Mot de passe
nouveau ? mot de passe oublié ?
Chargement... Chargement en cours...

Groupes français belges canadiens suisses internationaux Nétiquette
Échangez opinions et commentaires dans les forums de discussion.

Comparaîson étrange

 [  Nouvelle Discussion Nouvelle discussion  |  Répondre au groupe Répondre au groupe  |  fr.comp.lang.c ] 

Retour : Accueil du site fr comp lang c   charte stats de ce groupe


  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.


DateSujet  Auteur
01.01.
o 
Groups Explorer contact votre avis comment ça marche? rechercher un groupe suggérer un groupe abuse accueil du site   Imprimer cette page   Envoyer cette page à un(e) ami(e)
Usenet Gratuit