IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

FAQ -> liste d'initialisation


Sujet :

C++

  1. #21
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    J'ai surtout l'impression que tu crois que je râle...

    Un warning est un warning: "Ca m'empeche pas de compiler, mais je suis pas sur que ce que j'ai compris correspond bien a ce que tu veux faire".
    C'est bien pour cette raison, qu'en général, on pousse les warnings au maximum, en leur faisant la chasse comme si c'était des erreurs (d'ailleurs on peut tout à fait dire au compilo, si warning, considere ca comme une erreur, ce qui devrait être la règle par défaut à mon avis).

    Maintenant, trop de warnings poussent plus les programmeurs à baisser leur quantité par tweaking des options de compilation, plutôt que de les résoudre. Je me souviens d'un projet Eclipse par exemple, ou un mec avait viré les warning "Natural Language String" parce que dans son code ca lui faisait 300 warnings à chaque fichier...

    Et certains compilateur mettront un warning sur une liste d'initialisation sans effet de bord (simple application des paramètres du constructeur par exemple), simplement parceque l'ordre n'est pas celui de déclaration, hors ce warning est complètement inutile ! Alors qu'il est absoluement nécessaire dès qu'il y a effet de bord possible (code appelé...) voire même qu'il soit carrément une erreur si il y a un comportement clairement indéfini !

  2. #22
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Mais à ce moment là, il faut bien plus faire prendre conscience au programmeur qu'il est bien plus constructif de prendre un avertissement en compte que de diminuer le niveau d'avertissement...

    Sinon, la loi de murphy nous indique que, s'il y a une c... à faire, on trouvera toujours quelqu'un pour la faire

    Et comme les petits ruisseaux font les grands fleuves:

    On commence par ne pas avertir que la liste d'initialisation sera pris dans l'ordre parce que c'est un comportement prévu par la norme

    On continue en ne prévenant pas par un "1 est toujours vrai" quand on voit un code du genre de
    (poussé à l'extrème, je te l'accorde )

    car, finalement, ce n'est qu'un comportement prévu par la norme

    Sauf que, dans ce cas, fonction() est sensée modifier une valeur... mais elle n'est jamais appelée

    Et au final, on obtient une application qui ne fait pas la moitié de ce qu'elle doit faire, ou qui le fait mal, ou qui ne réagit pas comme elle le devrait...

    Alors, où arrêter le raisonnement du "c'est prévu par la norme"

    Autant se dire que, si le compilateur travaille différemment de ce que le codage laisse supposer, car les modifications à apporter ne sont, en définitive jamais si importantes que cela pour prendre les avertissements en compte, et s'assurer par ce simple fait que le programmeur aura pris conscience de son mauvais comportement...

    Apres tout, un avertissement sur une liste d'initialisation gérée dans un autre ordre, ca nécessite quoi

    A peine le déplacement d'un terme, qui peut parfaitement être résolu par un couper/coller... Enorme comme travail, non

    Mais, au moins, on s'assure que si l'initialisation fait appel à un comportement à effet de bord, ce sera d'office pris en compte
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #23
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    J'ai vaguement l'impression qu'on ne parle pas de la même chose....

    La norme indique ce que doit faire le code généré par le compilateur....
    Le compilateur essaye de traduire ce que veut faire le codeur.

    1. Si il n'y a aucune ambiguité possible... par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class A {
       int a, b;
       A() : b(0), a(0) {}
    };
    Pourquoi mettre un warning ?


    2. Si il y a ambiguité, mais "qui n'a pas l'air" de prêter à conséquence, le compilateur va faire un choix pour nous, et DOIT nous avertir que ceci est dangereux... par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class A {
       int a,b;
       A(int n) : b(n++), a(n++) {}
    };
    On doit être rappelé que a va être construit avant b ! Le codeur, pour supprimer le warning, n'a qu'à inverser l'ordre de la liste d'initialisation...

    3. Si il y a un comportement indéfini, le compilateur DOIT pondre une erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class A {
       int a,b;
       A(int n) : b(a++), a(n) {}
    };

    Et ensuite ? tu préfères un warning dans le cas 1 ? Pourquoi ?
    Pour éviter que si quelqu'un modifie le code plus tard il n'ai des problêmes ? Mais dans ce cas il tombera dans le cas 2 (warning) ou 3 (error) à la compilation... Je continue de ne pas voir l'interêt du warning pour le cas 1 !

  4. #24
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Accroche toi à tes baskets, car je vais te faire la preuve par l'absurde du problème d'avertissements trop "ciblés"

    Je reprend tes deux codes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A {
       int a;
       int b;
       int c;
     
       inline A(int p1, int p2) : c(p1), b(p2), a(0) {}//aucun avertissement
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A {
       int a;
       int b;
       int c;
     
       inline A(int p1, int p2) : c(p1), b(p2), a(p1++) {}//avertissement à cause de p1++
    };
    je modifie à peine le premier pour les assembler en un seul
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class A {
            int a;
            int b;
            int c;
        public: 
            /* pas d'avertissement */
            inline A(int p1, int p2, int p3) : c(p1), b(p2), a(p3) {}
           /* avertissement */
            inline A(int p1, int p2) : c(p1), b(p2), a(p1++) {}
    };
    Maintenant, met toi à la place de celui qui fera la c... d'après la loi de Murphy:

    Mais je ne comprend absolument pas pourquoi mon de compilateur me sort un avertissement pour le deuxième constructeur et pas pour le premier alors que la liste d'initialisation est présentée exactement sous la même forme
    le compilateur ne sait pas ce qu'il dit : je ne fais pas attention à ses avertissements (ou pire: je les désactive)
    Et, résultat des courses, il s'étonnera que dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    A obj1(4,3,5);
    A obj2(4,3);
    ne fournisse pas deux objets ayant des valeurs identiques...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #25
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Ce que je veux dire, en définitive, l'avantage de fournir un avertissement sur un cas qui "pourrait potentiellement poser problème" permet de se garder à meilleure distance des cas qui posent "réellement problème".

    Si, dés le départ, tu "drille" le codeur à être attentif, dans sa liste d'initialisation, à l'ordre dans lequel il initialise les membres, même si, dans le contexte, cela ne pose aucun problème, il prendra l'habitude d'y être attentif.

    Et donc, il finira par s'éloigner du fameux cas "peau de banane" d'une initialisation en utilisant une fonction à effet de bord...

    Tout le monde sera alors gagnant
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [FAQ]Une entrée sur les listes d'initialisation
    Par koala01 dans le forum Contribuez
    Réponses: 2
    Dernier message: 04/03/2010, 10h24
  2. Réponses: 4
    Dernier message: 20/04/2008, 21h12
  3. Liste d'initialisation C++
    Par three minute hero dans le forum BOUML
    Réponses: 7
    Dernier message: 08/10/2007, 11h18
  4. [syntax] liste d'initialisation et heritage
    Par ZaaN dans le forum C++
    Réponses: 1
    Dernier message: 12/12/2006, 17h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo