Ich erstelle eine Art Frontend für ein Programm. Zum Starten des Programms verwende ich den Aufruf CreateProcess()
, der unter anderem einen Zeiger auf eine STARTUPINFO
Struktur erhält . Um die Struktur zu initialisieren, die ich früher gemacht habe:
STARTUPINFO startupInfo = {0}; // Or even '\0'.
startupInfo.cb = sizeof(startupInfo);
Wenn -Wall -Wextra
ich das Programm mit GCC kompiliere, das diese Warnsätze aktiviert , erhalte ich eine Warnung, dass ein Initialisierer fehlt, der auf die erste Zeile zeigt.
warning: missing initializer
warning: (near initialization for 'startupInfo.lpReserved')
Also habe ich Folgendes gemacht:
STARTUPINFO startupInfo;
memset(&startupInfo, 0, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
Auf diese Weise gibt der Compiler keine Warnung aus. Die Frage ist, was ist der Unterschied zwischen diesen Arten der Initialisierung einer Struktur? Wird die Struktur mit der ersten Methode nicht initialisiert? Welches würdest du empfehlen?
struct struct_with_four_fields x = {1, 2, 3};
Wenn nur 3 von 4 Mitgliedern initialisiert werden.{ 0 }
ist jedoch eine gebräuchliche und genau definierte Redewendung zum Initialisieren aller Mitglieder auf Null (rekursiv für jedes Untermitglied definiert). Aus diesem Grund wurden spätere Versionen von gcc geändert, um nicht vor diesem speziellen Fall zu warnen.obj = {0};
in der Nachricht, mit der Sie verknüpft haben, ungültig C, und gcc 4.8.2 weist sie als Syntaxfehler zurück. Wenn Sie als C ++ kompilieren, denken Sie daran, dass es sich um eine andere Sprache handelt und gcc ein anderes Frontend verwendet. Korrekturen im C-Compiler von gcc können für g ++ gelten oder nicht.Antworten:
GCC ist einfach zu paranoid - meiner Meinung nach ohne guten Grund, aber dann ist es sicher richtig, dass die GCC-Betreuer viel mehr über die Nuancen von C wissen, die ich tue.
Siehe diesen kleinen Diskussionsthread über das Problem auf der GCC-Mailingliste:
Fazit: Wenn Sie die Struktur mit just
{0}
initialisieren, wird das Ganze tatsächlich mit Null initialisiert.Der C99-Standard besagt in 6.7.8 / 21 "Initialisierung - Sematik" Folgendes:
C90 sagt im Wesentlichen dasselbe in 6.5.7 mit einem etwas anderen Wortlaut (mit anderen Worten, C99 hat hier nichts Neues hinzugefügt).
Beachten Sie auch, dass dies in C ++ so erweitert wurde, dass ein leerer Satz von Klammern "
{}
" eine Wertinitialisierung für ein Objekt durchführt, da es Situationen (wie Vorlagen) gab, in denen Sie nicht einmal wussten, welche Mitglieder oder wie viele Mitglieder ein Typ sind könnte haben. Es ist also nicht nur eine gute Praxis, sondern manchmal auch erforderlich, eine Initialisierungsliste zu haben, die kürzer ist als die Anzahl der Mitglieder, die ein Objekt möglicherweise hat.quelle
-Wno-missing-field-initializers
und-Wno-missing-braces
so hörte GGC auf zu stöhnen, dass ich= {0};
meine Strukturen einsetzte. Weiß jemand, ob beim Deaktivieren dieser Warnung Warnungen für andere Dinge als= {0};
für Strukturen übersehen werden?mingw32-g++.exe (GCC) 4.7.2
ich diese Warnung und erhalte sie in der obigen Sprache (sogar im genauen Fall vonSTARTUPINFO
).{}
oder{0}
Initialisierer in meinen C ++ - Klassen verwende: /Dies kann für GCC in C ++ - Programmen leicht behoben werden, indem die Struktur als initialisiert wird
quelle
Sie haben so viele Warnungen wie möglich angefordert
-Wall -Wextra
.In diesem Fall erhalten Sie eine Warnung, die Sie darüber informiert, dass Sie nicht alle Felder angegeben haben. Dies ist vollkommen gültig, könnte aber unbeabsichtigt gewesen sein.
Sie können diese Warnung durch Hinzufügen unterdrücken
-Wno-missing-field-initializers
quelle
Auf dieser Webseite wird das zugrunde liegende Problem ausführlich erläutert: http://ex-parrot.com/~chris/random/initialise.html
Als Workaround besteht meine aktuelle Lösung darin, diese Warnung selektiv zu unterdrücken:
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wmissing-field-initializers" STARTUPINFO startupInfo = {0}; #pragma clang diagnostic pop
Leider funktioniert dies nur in Clang und scheint in GCC nicht zu funktionieren.
quelle
#pragma GCC diagnostic ignored "-Wmissing-field-initializers"
vom GCC-Compiler 4.2.1 akzeptiert, aber nichts tun. unsicher über neue Versionen von gcc#pragma clang diagnostic ignored "-Wmissing-field-initializers"
. Sie sollten wahrscheinlich prüfen, ob dies der Fall ist.In C ++ können Sie
boost::initialized_value
diese Warnung entfernen. Ich habe Warnungen deaktiviert fürboost
; Ich weiß also nicht, ob dies in Ihrem Fall zu anderen Warnungen führen würde. Auf diese Weise müssen Sie die Warnung nicht deaktivieren.Beispiel:
quelle