66 votes

Déclaration de variable après goto Label

Aujourd'hui j'ai trouvé une chose intéressante. Je ne savais pas que l'on ne peut pas déclarer une variable après un goto label.

Compiler le code suivant

#include <stdio.h>
int main() {
    int x = 5;
    goto JUMP;
    printf("x is : %d\n",x);
JUMP:
    int a = 0;  <=== giving me all sorts of error..
    printf("%d",a);
}

donne des erreurs de ce type

temp.c: In function ‘main':
temp.c:7: error: expected expression before ‘int'
temp.c:8: error: ‘a' undeclared (first use in this function)
temp.c:8: error: (Each undeclared identifier is reported only once
temp.c:8: error: for each function it appears in.)

Maintenant, quelle est la logique derrière cela? J'ai entendu dire que l'on ne peut créer des variables à l'intérieur de l'affaire états de l'interrupteur. Depuis le SAUT est à l'intérieur du même champ (le champ d'application de la fonction principale, dans mon cas) de l'instruction goto, je crois que la portée n'est pas un problème ici. Mais alors, pourquoi j'obtiens cette erreur?

84voto

Stephen Canon Points 58003

La syntaxe ne le permet tout simplement pas. §6.8.1 Déclarations étiquetées:

 labeled-statement:
    identifier : statement
    case constant-expression : statement
    default : statement
 

Notez qu’aucune clause n’autorise une "déclaration étiquetée". Cela ne fait tout simplement pas partie de la langue.

Vous pouvez naturellement contourner ce problème, bien sûr, avec une déclaration vide.

 JUMP:;
int a = 0;
 

14voto

Basile Starynkevitch Points 67055

Vous voulez un point-virgule après l'étiquette comme ceci:

  #include <stdio.h>
 int main() {
     int x = 5;
     goto JUMP;
     printf("x is : %d\n",x);
 JUMP: ;     /// semicolon for empty statement
     int a = 0; 
     printf("%d",a);
 }    
 

Ensuite, votre code est compilé correctement pour le standard C99, avec gcc -Wall -std=c99 -c krishna.c (j'utilise GCC 4.6 sur Debian / Sid / AMD64).

6voto

Patrick B. Points 4437

Ma version de gcc (4.4) donne cette erreur de compilation:

 t.c:7: error: a label can only be part of a statement and a declaration is not a statement
 

. Ce message d'erreur dit tout.

6voto

jmoreno Points 6995

Une explication simple, autre que la spécification ne le dit pas, est que le compilateur attend le code après que la fonction goto soit compilée dans une opération dont il peut ensuite calculer le décalage, et qui donne un coup de pied parce que votre déclaration de variable n'est pas une instruction. / bloc qu'il peut compiler dans un tel décalage.

2voto

Eh bien, vous devriez d'abord être cohérent. C'est soit LABEL ou label . Deuxièmement, l'étiquette est une partie de la déclaration et la déclaration ne répond pas suffisamment à la description.

Vous pouvez remplacer LABEL: par label: ; et il est alors plus facile de compiler.

EDIT: Maintenant que vous avez modifié votre code partout, il devrait être JUMP: remplacé par JUMP: ; ;-)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X