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 .
/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?).
x
nach dem Sprung verwenden.