Statement-Goto kann die Variablendefinition nicht kreuzen?
Nehme an, dieser code kompiliert in g++
:
#include <stdlib.h>
int main() {
int a =0;
goto exit;
int *b = NULL;
exit:
return 0;
}
g++
werfen Fehler:
goto_test.c:10:1: error: jump to label ‘exit’ [-fpermissive]
goto_test.c:6:10: error: from here [-fpermissive]
goto_test.c:8:10: error: crosses initialization of ‘int* b’
Wie es scheint, dass die goto
nicht überqueren können Zeiger-definition, aber gcc
stellt Sie ok, nichts beschwert.
Nachdem Sie den Fehler behoben haben, müssen wir deklarieren alle Hinweise, bevor die goto
- Anweisung, das heißt, Sie müssen erklären Sie diese Hinweise, auch wenn Sie nicht müssen Sie auf die Gegenwart (und die Verletzung mit einigen Prinzipien).
Was die Herkunft design-überlegung, dass g++
verboten, die nützlich Schwanz-springen Aussage?
Update:
goto
können cross-variable (jede Art der Variablen nicht beschränkt auf pointer) Deklaration aber außer denen hat, dass eine Initialisierung mit dem Wert. Wenn wir entfernen Sie die NULL
Zuordnung oben g++
schweigen jetzt. Also, wenn Sie wollen, um Variablen zu deklarieren, die zwischen goto
-cross-Bereich, nicht initialisieren Sie diese (und noch gegen einige Prinzipien).
InformationsquelleAutor der Frage coanor | 2013-01-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Goto kann nicht überspringen über Definitionen von Variablen, da die Variablen würde nicht existieren nach dem Klick, da die Lebensdauer von Variablen beginnt mit dem Zeitpunkt der definition. Die Angabe scheint nicht explizit erwähnt, springen muss nicht, aber es ist implizit in dem, was gesagt wird über die variable Lebensdauer.
Da der Fehler erwähnt
[-fpermissive]
können Sie schalten Sie es auf "Warnung" durch die Angabe, dass compiler-flag. Dies zeigt zwei Dinge. Dass es verwendet werden darf (die Variablen existieren würde, aber nicht initialisiert werden, nach dem Klick), und dass die gcc-Entwickler glauben, dass die Spezifikation Formulierung impliziert dies verboten ist (oder bedeutet es ist Undefiniertes Verhalten, die Sie wählen, zu verbieten, weil Sie es können).Der compiler überprüft nur, ob die variable formell existiert, aber nicht ob es verwendet wird, sonst würden die Ergebnisse eher inkonsistent. Aber wenn Sie nicht brauchen, die variable mehr, können Sie am Ende seiner Lebenszeit selbst, so dass der "Schwanz-springen" sinnvoll:
ist vollkommen gültig.
Auf einer Seite-beachten Sie die Kompilierung mit
g++
aber solange die Datei hat die Erweiterung.c
gilt es als C und nicht C++.gcc
undg++
unterscheiden sich in einigen Standard-flags, vor allem für die linker-phase, aber beide kompilieren jede installierte Sprache (C, C++, ObjC, ObjC++), wie entschlossen, durch die Erweiterung.InformationsquelleAutor der Antwort Jan Hudec
Gibt es einen einfachen work-around für solche primitiven Typen wie
int
:InformationsquelleAutor der Antwort Robin Hsu