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 :

Switch et "default label in switch which covers all enumeration values"


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 136
    Par défaut Switch et "default label in switch which covers all enumeration values"
    Bonjour à tous,

    dans mon code, j'utilise un "Switch", mais au niveau du default, j'obtiens ce commentaire "default label in switch which covers all enumeration values"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        switch (Value)
        {
          case 1:
            ....
          break;
          case 3:
            ....
          break;
          case 5:
          default:                                                                        default label in switch which covers all enumeration values
            ....
          break;
        }
    Je sais que je pourrai mettre que le default sans le case 5, mais je tiens à conserver les deux ensemble.
    je souhaiterai savoir comment l'éliminer, est-ce un problème de syntaxe ?

    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Clang t'informe que default est inutile parce que toutes les valeurs d'enum sont déjà gérées dans des case.
    - Pourquoi avoir default si toutes les valeurs sont gérées ?
    - Pourquoi cacher un potentiel bug en mettant un default qui couvrira les futures valeurs d'enum ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Ton code parait correct, c'est une syntaxe que j'utilise très souvent.
    L'avertissement que tu reçois, je ne l'ai jamais eu, ça doit venir de ton compilateur. En sachant celui que tu utilises, quelqu'un pourrait t'indiquer comment désactiver cet avertissement.
    Mais je le comprendrait plutôt comme étant : "attention il y a plusieurs cases, mais aucun n'est accessible à part le default". Autrement dit, ça n'est pas le case 5 le problème mais les case 1 et case 3. Il est bizarre cet avertissement!

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 136
    Par défaut
    Effectivement, dans le switch, on teste un enum.
    Tous les enums sont indentifiés dans les différents cases, mais dans mon exemple, pour le case 5 (qui est un des éléement de l'énum), on doit avoir la même action que si l'on passait une valeur qui ne ferait pas partir des éléments de cet enum.
    Théoriquement ça ne devrait jamais arriver, seulement il est toujours possible de mettre une mauvaise valeur et donc il faut passer par le "default"

    J'espère avoir était un peu plus clair

    Pour info, je suis sur Qt 5.12.0 (MSVC 2015, 32 bit)

    Merci

  5. #5
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Tu veux dire que `Value` est un entier et pas un énumération?
    Quel est le type de Value?

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 136
    Par défaut
    Non Value est un enum, bon je refais mon code pour que ce soit plus compréhensible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        switch (Value)
        {
          case enum1:
            ....
          break;
          case enum3:
            ....
          break;
          case enum5:
          default:                                                                        default label in switch which covers all enumeration values
            ....
          break;
        }

  7. #7
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Citation Envoyé par Amfrey95 Voir le message
    Non Value est un enum, bon je refais mon code pour que ce soit plus compréhensible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        switch (Value)
        {
          case enum1:
            ....
          break;
          case enum3:
            ....
          break;
          case enum5:
          default:                                                                        default label in switch which covers all enumeration values
            ....
          break;
        }
    Alors en effet le compilateur a raison, ton case enum 5: est inutile et redondant avec ton default. Enlève ton case enum 5: ou alors tu fais un case pour chaque valeur de l'énumération

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Amfrey95 Voir le message
    seulement il est toujours possible de mettre une mauvaise valeur et donc il faut passer par le "default"
    Non. Si tu te retrouves avec une valeur d'enum invalide, c'est que ton code ne fait pas les vérifications correctes à un moment.
    S'il vient de n'importe où qui le transfère et casté depuis un entier et perd son status d'enum à un moment, c'est ça qu'il faut corriger. Tu propages un truc potentiellement invalide.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2018
    Messages
    136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2018
    Messages : 136
    Par défaut
    ok merci pour les réponses, je pensais que c'était dû à a et vous venez de me le confirmer.
    Sujet résolu, merci

  10. #10
    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 : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Ce que je fais régulièrement quand je travaille avec des valeurs énumérées, c'est effectivement de prévoir une valeur "invalide" (généralement MAX, qui m'est d'ailleurs utiles pour d'autres raisons) et qui justifie le passage par default, dans lequel je met une assertion qui claquera toujours:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    enum MyEnum{
        first,
        second,
        third,
        MAX_ENUM
    };
     
     
    /* et, ailleurs dans le code */
    switch(enumValue){
        case first:
            /* ... */
            break;
        case second:
            /* ... */
            break;
        case third:
            /* ... */
            break;
        default:
            assert(false && "You should never come here");
    };
    De cette manière, MAX_ENUM va forcément passer dans default (mais aussi toutes les autres valeurs qui seraient en fait invalides) et l'assertion obligera le développeur à corriger le problème qu'il a laissé passer "ailleurs" avant l'appel de la fonction.

    Evidemment, ce n'est que la "dernière ligne de défense" qui ne peut être utilisée que si une politique stricte de tests est mise en place et appliquée
    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.

Discussions similaires

  1. Passer d'un case à un default (Switch)
    Par Allspark dans le forum C#
    Réponses: 9
    Dernier message: 27/08/2010, 16h03
  2. switch/case & default
    Par Invité(e) dans le forum Général Python
    Réponses: 10
    Dernier message: 13/11/2009, 11h57
  3. switch case ET DEFAULT
    Par hellalaboy dans le forum Général VBA
    Réponses: 3
    Dernier message: 02/09/2009, 16h21
  4. select one menu + default label
    Par ghnawfal dans le forum JSF
    Réponses: 7
    Dernier message: 05/09/2008, 15h05
  5. Position de default et case dans un switch
    Par Glutinus dans le forum C
    Réponses: 16
    Dernier message: 11/09/2006, 22h17

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