Partage
  • Partager sur Facebook
  • Partager sur Twitter

La ligne de commande pour C++

Sujet résolu
    20 février 2020 à 4:54:31

    Bonjour,
    Où puis-je trouver la description de la ligne de commande du compilateur C++
    Je suis sur Windows 10 avec Mingw-w64 et je travaille avec cmd.
    Le package contient les compilateurs C et C++.
    Ce qui m'intéresse entre autres, ce sont les warning que je peux activer.
    Juste un exemple, sur la ligne suivante:
    bool cestFaux(432);
    Je m'attendrais à une erreur, au mieux un warning.
    Quand je l'affiche, il me donne '1'.
    Je pensais que bool était l'équivalent du type 'enum' de C.
    enum bool {false, true};
    Je commence en C++ mais je connais bien C.
    • Partager sur Facebook
    • Partager sur Twitter

    Le Tout est souvent plus grand que la somme de ses parties.

      20 février 2020 à 8:01:59

      Salut,

      Hé non, bool est un type qui n'accepte que les valeur true et false, mais c'est, avant tout, un type qui est compatible avec n'importe quel autre type numérique.

      Ou, plus précisément, n'importe quel type numérique (qu'il s'agisse d'un entier ou d'un réel) peut être automatiquement converti en booléen, selon une règle simple:

      • 0 peut être converti en false (faux), quel que soit le type envisagé
      • tout ce qui n'est pas équivalent à false vaut true (vrai)

      Cette règle permet d'utiliser n'importe quelle valeur numérique dans un test rapide, sous une forme proche de

      int i;
      /* ... */
      if(i){  //false si i == 0, true dans les autres cas
          /* ... */
      }

      Mais on utilisera encore plus souvent cette possibilité avec des pointeurs:

      Type * ptr;
      /* ... */
      if(ptr){ // false si ptr == nullptr (NULL), true dans les
               // autres cas
          /* ... */
      }

      Il n'y a donc aucune raison que le compilateur te donne ne serait-ce qu'un avertissement lorsque tu utilise une valeur numérique pour définir un booléen ;)

      -
      Edité par koala01 20 février 2020 à 8:04:05

      • Partager sur Facebook
      • Partager sur Twitter
      Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
        20 février 2020 à 13:56:40

        > Il n'y a donc aucune raison que le compilateur te donne ne serait-ce qu'un avertissement lorsque tu utilises une valeur numérique pour définir un booléen.

        Si quand même. Mettre un littéral autre que 0 ou 1 pour un bool est sûrement une erreur. C'est d'ailleurs une des vérifications faite par clang-tidy.

        Pour éviter les erreurs avec perte, on peut utiliser les accolades:

        bool x{0}; // ok = false
        bool x{1}; // ok = true
        bool x{2}; // erreur de compilation

        (https://wandbox.org/permlink/v1vO9dQBcaxurDbm)

        Mais qui ne retourne aucun avertissement/erreur avant g++-9 (ce qui n'est pas conforme à la norme -_-).

        • Partager sur Facebook
        • Partager sur Twitter
          20 février 2020 à 18:42:18

          En utilisant les parenthèses cela doit produire un Warning par contre c'est effectivement une erreur utilisant les accolades si l'initialiseur n'est pas 0, 1, false ou true.

          Visual C++ 15.9.17 donne :

          bool x1(12);   // Avertissement	C4305 'initialisation' : troncation de 'int' à 'bool'
          bool x2{13};   // Erreur C2397 la conversion de 'int' en 'bool' requiert une conversion restrictive
          bool x3{1};    // Ça c'est OK
          



          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

            20 février 2020 à 19:00:26

            Salut,
            C'est peut-être que ma version de g++ n'est pas à jour. J'ai fait:
            g++ --version
            et j'obtient:
            g++ (x86_64-win32-seh-rev0, Built by MinGW-W64 project) 8.1.0
            En C, on n'a pas le type "bool" et on se sert des astuces mentionnées comme si c'en était.
            Ce qui est encore plus déroutant est que j'ai essayé les formes:
            bool cestFaux(true);  // forme officielle, j'ai volontairement fait une contradiction ...
            bool cestFaux(432);
            bool cestFaux[432];
            bool cestFaux=432;  // comme en C
            et je n'ai même pas de warning.
            Dans tous les cas, 'cout' me retourne '1'.
            Je me demande pourquoi on a définit un type 'bool' si on peut le contourner aussi facilement.
            Existe-til une option du genre -Wall ou -Wextra comme en C qui donne tous les warning?
            Je les ai essayé avec g++ et je n'ai pas plus de warning.
            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

              20 février 2020 à 19:05:18

              >si on peut le contourner aussi facilement.

              Pour la "compatibilité" avec le C. :colere2:

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                20 février 2020 à 19:35:29

                PierrotLeFou a écrit:


                En C, on n'a pas le type "bool" et on se sert des astuces mentionnées comme si c'en était.
                Depuis une revision ( 1999 je crois ) on a en C , l' header <stdbool.h> qui permet de disposer du type 'bool' et des constantes 'true' et 'false'. ;)
                • Partager sur Facebook
                • Partager sur Twitter

                Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

                  20 février 2020 à 20:26:04

                  > Existe-til une option du genre -Wall ou -Wextra comme en C qui donne tous les warning?

                  Tous les warnings... rigole doucement.

                  Wall et Wextra n'activent pas tous les avertissements, il y en a une dizaine qui sont utiles mais non activés et encore pas mal qui peuvent être problématique. Il n'y a que clang qui possède un Weverything qui active tout, mais sur lequel il faut repasser derrière pour en désactiver (c'est un peu trop brutal). Le comportement est le même que se soit en C ou en C++, seul la liste des avertissements activé change. Je maintiens un dépôt avec les options par version de compilateur: cpp-compiler-options.

                  Mais ni clang, ni gcc n'ont d'avertissement pour les booléens. Il n'y a qu'un Wint-in-bool-context dans gcc qui sort entre autres pour des ternaires qui retourne des littéraux autres que 0 et 1: bool b = x ? 2 : 0.

                  > Je me demande pourquoi on a définit un type 'bool' si on peut le contourner aussi facilement.

                  Ce n'est pas un contournement, mais une conversion. Comme n'importe quel entier est converti en n'importe qu'elle autre silencieusement. C'est la même chose que dans if(i) avec i un entier de valeur 7, c'est vrai, et aucun compilateur ne va se plaindre.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 février 2020 à 22:59:02

                    C'est vrai que c'est une conversion et non un contournement.
                    Si je fais en C:
                    if(i) ...
                    et que 'i' n'est pas égal à 0 et que je l'imprime, j'obtiendrai sa valeur, pas 1.
                    Tandis qu'en C++, il semble que mes 'bool' ont bien été converti en '1'.
                    Où se fait la conversion? Lors de la définition ou lors de l'impression?
                    Je suis tout de même surpris de toutes les formes possibles pour le définir.
                    Pour ce qui est des warning, même s'il y en a 1500, il faut être "habile" pour les faire sortir tous dans son code ...
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Le Tout est souvent plus grand que la somme de ses parties.

                      21 février 2020 à 19:18:53

                      PierrotLeFou a écrit:

                      Où se fait la conversion? Lors de la définition ou lors de l'impression?

                      Lors de la définition de ton booléen, car il ne peut contenir que deux valeurs : 0 pour faux et 1 pour vrai. C'est le principe même de ce type de valeur.

                      Note que l'on aurait pu choisir n'importe quelle valeur par convention pour représenter les valeurs faux et vrai exactement de la même manière  que l'on a décidé, par convention que 1+1 =2 et non 4...  Nous aurions tout aussi bien pu choisir de représenter faux par 456 et vrai par 999 ... ou l'inverse,

                      La seule chose, c'est qu'une telle convention aurait été "surprenante" du fait des autres conventions établies (l'absence de quelque chose se représente par le symbole 0, un seul élément se représente par le symbole 1 et le résultat de 1+1 se représente par le symbole 2).

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                        21 février 2020 à 19:58:44

                        Le standard 99 a introduit

                        • le type prédéfini _Bool
                        • l'entête stdbool.h qui fait de bool un synonyme de _Bool

                        Raison historique :

                        Le langage C a été conçu avec les pieds comme un langage de cowboys qui savent ce qu'ils font, car ce sont de vrais hommes avec des poils sous le bras, et peuvent se passer de tout. Donc pas besoin de booléens, puisqu'il suffit d'avoir des indicateurs dans des entiers, qui peuvent prendre plusieurs valeurs, c'est encore mieux.

                        Du coup, dans le code il y a eu des gens qui définissaient (sous la mauvaise influence des boches pascaliens) des type bool, soit comme alias de int ou de char, ou alors des enums, et des constantes true false, à moins que ça soit TRUE FALSE ou encore True False.  et 1 ou -1 pour true ?

                        Bref, pour peu qu'on importe deux ou trois bibliothèques comme ça, on se retrouve avec des conflits.

                        Du coup

                        • introduction du type _Bool qui risque pas trop d'être en conflit.
                        • et à moins d'avoir la malchance d'utiliser du vieux code pourri, utilisez stdbool.h, qui est le standard recommandé
                        • Partager sur Facebook
                        • Partager sur Twitter
                          23 février 2020 à 1:42:48

                          Ça  n'est pas ça qui va m'empêcher de coder en C++ mais je pensais que les nouveaux compilateurs respectaient mieux les standards.
                          Le cours sur C++ d'OpenClassrooms n'est pas jeune, comme celui de C d'ailleurs.
                          J'ai trouvé le cours de Zeste de savoir sur C++ qui me semble plus à jour.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Le Tout est souvent plus grand que la somme de ses parties.

                          La ligne de commande pour C++

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown