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 défault vide


Sujet :

C

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut switch et défault vide
    Bonjour

    Voici mon code sans warning ni erreur de compilation :

    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
        switch(classe_add->origine)
        {
        case -1 :
            printf("Classe %s origine non identifiée\n",classe_add->nom);
            break;
        case -2 :
            printf("Classe %s origine absente\n",classe_add->nom);
            break;
        case -3 : /* ce serait une erreur dans le code source */
            printf("Coordonnée %s mauvaises\n",FEUILLE_ORIGINE);
            break;
        default :
                printf("c");
            /* pas de problème : origine bien trouvée */
        }
    Si j'enlève le default, j'ai ce warning :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ||=== Build: Debug in Perso4 (compiler: GNU GCC Compiler) ===|
    /home/troumad/Documents/perso/lecture_fichier.c|708|warning: le «*switch*» n'a pas de branche par défaut [-Wswitch-default]|
    ||=== Build finished: 0 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|
    Si j'enlève le printf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ||=== Build: Debug in Perso4 (compiler: GNU GCC Compiler) ===|
    /home/troumad/Documents/perso/lecture_fichier.c|719|error: étiquette à la fin d'une déclaration composée|
    ||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
    C'est quoi cette erreur ?
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Une petite recherche sur Internet et on tombe sur le fil stackoverflow - label at end of compound statement

    Cela semble plus être un bogue de gcc qui devrait faire un warning et non pas une erreur.
    Mais rajouter juste un break cela ne mange pas de pain

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Merci !

    Donc, c'est un warning qu'il devrait mettre et pas une erreur. je comprends déjà mieux.

    Le break à la fin, comme tu l'indiques, est encore mieux que mon printf. Par conte, je ne comprends pas pourquoi il souhaite un break à la fin. IL est entièrement inutile.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Si on ne met rien après un case ou un default final, il s'agit bien d'une erreur car après un label il doit y avoir une instruction.
    Par contre oublier un break en toute dernière instruction d'un switch pourrait être un warning, mais pourquoi? Quel serait le risque?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    switch ( x ) {
       case 1: return true;
       // pas de break, pas de warning non plus car il y un return avant
       case 2:
       // erreur il n'y a rien entre le : et le } il faut moins ajouter une instruction vide donc un ;
    }
    switch ( y ) {
       default:
           printf("cas default");
       // ici le compilateur peut émettre un warning, voulait-on un break ici?
       case 1: return true;
       case 2:; // ici tout est okay, il y a bien une instruction après le case
    }

  5. #5
    Membre régulier Avatar de ekieki
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Avril 2014
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Avril 2014
    Messages : 34
    Points : 103
    Points
    103
    Par défaut
    Le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void foo(int n) 
    {
       switch(n) 
         {
          case 0:    break;
          default:  ;              // pas de break, ok
         }
    }
    ne soulève aucun protestation de la part du compilateur gcc 6.3.0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ gcc -std=c11 -c -Wall -Wextra -pedantic a.c
    par contre il y en a une, si on omet le point virgule après default :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    switch(n) 
    {
          case 0:    break;
          default:        //  error: label at end of compound statement
    }
    parce que

    • un label doit obligatoirement être suivi d'une instruction au moins
    • un point-virgule constitue une instruction (vide)



    Donc, pour résumer, dans vos exemples, ce qui manque, c'est pas un break, mais une instruction quelconque à la suite de label deux-points.

    Pour ce qui est du compilateur, il va très bien, merci pour lui.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CR9] Bug avec les champs à valeur vide ?
    Par Djob dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 15/07/2003, 21h21
  2. [DOM] Balise vide...
    Par carlierd dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 02/05/2003, 18h28
  3. Réponses: 6
    Dernier message: 26/01/2003, 13h45
  4. [] Datagrid vide après modification des propriétés
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 20/09/2002, 16h37
  5. [CR] Avoir seulement une page blanche qd la base est vide???
    Par littleChick dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 13/08/2002, 18h26

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