Das folgende C++ Beispiel nicht kompiliert, sondern erzeugt nur eine Warnung mit ICC, und gar nichts mit MSVC:Fehler: Sprung mit gcc oder Klappern, beschriften ‚foo‘ kreuzen Initialisierung von ‚bar‘
int main(int argc, char *argv[])
{
if (argc < 2)
goto clean_up;
#if 1 // FAIL
int i = 0;
#elif 0 // workaround - OK
{
int i = 0;
}
#else // workaround - OK
int i;
i = 0;
#endif
clean_up:
return 0;
}
g ++:
init.cpp:13: error: jump to label ‘clean_up’
init.cpp:4: error: from here
init.cpp:7: error: crosses initialization of ‘int i’
Klirren ++:
init.cpp:4:9: error: cannot jump from this goto statement to its label
goto clean_up;
^
init.cpp:7:9: note: jump bypasses variable initialization
int i = 0;
^
ICC:
Ich verstehe die Ursache des Fehlers, und für ein einfaches Beispiel wie dies ist es ziemlich einfach zu umgehen (ich habe ein paar mögliche Umgehungsmöglichkeiten im obigen Beispiel enthalten), aber ich arbeite daran eine große Cross-Plattform-Legacy-Codebasis, die mit Fehlerbehandlungsmakros gespickt ist, die ein ähnliches goto
-Konstrukt verwenden. Andere Entwickler, die mit MSVC oder ICC arbeiten, führen immer Inline-Initialisierungen ein, die in der Folge zu Fehlern bei gcc- oder clang-Builds führen (und ignorieren natürlich nur die Warnungen, die sie mit MSVC/ICC erhalten).
Also muss ich einen Weg finden, um entweder (a) solche Fälle zu Fehlern auf ICC/MSVC zu bringen oder (b) sie auf Warnungen mit gcc/clang zu reduzieren. Ich versuchte -fpermissive
mit gcc, aber das scheint nicht zu helfen.
Für zusätzliche Kredite bin ich auch in Bezug auf die Gründe für diesen Fehler für die einfache skalare Initialisierung neugierig - kann ich sehen, warum über einen Konstruktor springen könnte problematisch sein, aber eine
int
wie im obigen Beispiel scheint nicht initialisiert Wie könnte es jemals ein Problem sein, und einfach die Definition + Initialisierung in eine Definition + Zuordnung aufteilen lässt den Fehler weg?
In C ist dies erlaubt (obwohl verpönt). Nicht sicher über C++. – Bathsheba
Entwickler sollten auch ihre Compiler-Warnungen beheben, nicht nur Fehler. – Melebius
@Bathsheba: Ja, diese Legacy-Makros stammen ursprünglich aus einer C-Code-Basis, aber jetzt wird zunehmend C++ - Code verwendet und ich muss jedes neue Auftreten dieses Problems beheben. –