Betrachten Sie diesen Code:
void foo()
{
goto bar;
int x = 0;
bar: ;
}
GCC und Clang lehnen dies ab , da der Sprung zur bar:
Umgehung der Variableninitialisierung erfolgt. MSVC beschwert sich überhaupt nicht (außer mitx
After verwendet bar:
wird, wird eine Warnung ).
Wir können etwas Ähnliches tun mit switch
:
void foo()
{
switch (0)
{
int x = 0;
case 0: ;
}
}
Nun alle drei Compiler Fehler aus .
Sind diese Schnipsel schlecht geformt? Oder verursachen sie UB?
Früher dachte ich, dass beide schlecht geformt waren, aber ich kann die offenbarenden Teile des Standards nicht finden. [stmt.goto] sagt nichts darüber und [stmt.select] auch nicht .
c++
language-lawyer
goto
initializer
variable-declaration
HolyBlackCat
quelle
quelle
x
nach dem Sprung verwenden./permissive-
Flag zu MSVC hinzu, und es wird sich ebenfalls beschweren. Ich weiß jedoch nicht, ob das Verhalten von MSVC ohne dieses Flag genau definiert ist (ich würde es annehmen, sonst warum sollten sie es zulassen?).Antworten:
Es ist schlecht geformt, wenn die Initialisierung nicht leer ist.
Der Initialisierer macht die Initialisierung nicht leer. Im Gegensatz dazu
wäre wohlgeformt. Es gelten jedoch die üblichen Einschränkungen bei der Verwendung
x
mit einem unbestimmten Wert.quelle
Aus der goto-Anweisung :
quelle