Fehler seit Update von GCC



  • Hi,

    ich verwende jetzt MinGW (gcc version 4.5.2). Ich bin mir nicht ganz sicher was ich vorher hatte. Irgendwas neueres aus der 3. Reihe glaub ich.

    Jedenfalls wollen viele meiner Sachen nicht mehr kompilieren. Jetzt bekomme ich immer den Fehler "note: synthesized method '...' first required here".

    Eine meiner Dateien hab ich mal auf das Minimum runtergestutzt und frage mich jetzt wieso das früher problemlos funktioniert hat und jetzt nicht mehr.

    #include <string>
    
    typedef struct _Type {
        std::string str;
    } TYPE;
    
    int main(void)
    {
        TYPE var;
    }
    
    3:22: warning: '_Type::str' should be initialized in the member initialization list
    9:10: note: synthesized method '_Type::_Type()' first required here
    

    Caster



  • Öh. Ich sehe keinen Fehler. Bloss eine Warning + Zusatzinfo. Was gemeint ist ist auch klar, auch wenn ich nicht verstehe wie jmd. auf die Idee kommen könnte in so einer Situation eine Warning auszugeben. Aber naja.



  • Lösung: niemals mit -Weffc++ kompilieren. -Wall und -Wextra reichen völlig.

    Edit: wenn ich mein aktuell geöffnetes Projekt mit -Weffc++ kompiliere, bekomme ich gleich 2373 Warnungen, obwohl es noch nicht besonders groß ist. Na Prost 🤡

    Außerdem scheint Code::Blocks ein Problem mit "note: " zu haben und interpretiert das als Compilerfehler.


  • Mod

    -Weffc++ gibt es schon ewig, selbst gcc 3.3.6 spuckt

    test.cpp: In constructor \_Type::\_Type()': test.cpp:9: warning:_Type::str' should be initialized in the member
    initialization list

    aus. Leider wird nicht auf den tatsächlich vorhandenen Fehler (Verwendung eines reservierten Bezeichners) trotz -pedantic und -ansi hingewiesen.



  • Vielleicht bringt das vollkommen sinnlose typedef den Compiler aus dem Tritt?



  • manni66 schrieb:

    Vielleicht bringt das vollkommen sinnlose typedef den Compiler aus dem Tritt?

    Wäre ein schlechter Compiler, wenn es das täte. Das sinnlose typedef ist C-Style...



  • pumuckl schrieb:

    manni66 schrieb:

    Vielleicht bringt das vollkommen sinnlose typedef den Compiler aus dem Tritt?

    Wäre ein schlechter Compiler, wenn es das täte. Das sinnlose typedef ist C-Style...

    Naja, du nimmst hoffentlich nicht an, dass der GNU-Compiler fehlerfrei ist. Gerade weil es alter C-Style aber eben mit std::string ist, hat es vielleicht niemand getestet.



  • manni66 schrieb:

    Naja, du nimmst hoffentlich nicht an, dass der GNU-Compiler fehlerfrei ist. Gerade weil es alter C-Style aber eben mit std::string ist, hat es vielleicht niemand getestet.

    Ich nehme nicht an, dass der Compiler fehlerfrei ist. Vielmehr gehe ich aber davon aus, dass so ein doch relativ häufig benutztes Konstrukt wie das typedef nicht mit der Generierung des Defaultkonstruktors interferiert, das wäre schon ziemlich tragisch. Und die Warnung kommt nunmal aus dem generierten Ctor und sieht das typedef überhaupt nicht.



  • Athar schrieb:

    Außerdem scheint Code::Blocks ein Problem mit "note: " zu haben und interpretiert das als Compilerfehler.

    OK, das ist das Problem. Ich verwende Code::Blocks und ich hab mich gefragt wieso die "note" als fehler gewertet wird. Ich hab mich nur gewundert, wieso bei meinen Projekten aufeinmal so viel rot (kompilierfehler) ist.

    Danke für die Antworten.

    Weiß jemand was die note genau zu bedeuten hat? Die Warnung ist ja klar, aber die note sagt mir gar nichts.



  • Caster schrieb:

    Athar schrieb:

    Außerdem scheint Code::Blocks ein Problem mit "note: " zu haben und interpretiert das als Compilerfehler.

    OK, das ist das Problem. Ich verwende Code::Blocks und ich hab mich gefragt wieso die "note" als fehler gewertet wird.

    Echt? Bei
    Compiler/Global Compiler Settings/Advanced Options/Compiler Note
    steht bei mir als Maske

    ([][{}() \t#%$~A-Za-z0-9_:+/\.-]+):([0-9]+):[ \t]([Nn]ote:[ \t].*)
    

    und als Typ "Info".
    Und die note:-Zeile aus diesem Thread analysiert er auch richtig und erkennt sie als Info.
    Und mein Code::Blocks unter Windows ist 14 Monate alt.



  • Caster schrieb:

    Weiß jemand was die note genau zu bedeuten hat? Die Warnung ist ja klar, aber die note sagt mir gar nichts.

    Das is nur ne Info, wo die impliziert definierte Funktion (hier der Default-Ctor) zum ersten mal gebraucht wurde.
    Weil die implizit definierten Funktionen erst erstellt werden, wenn sie gebraucht werden.

    Angenommen der Default-Ctor kann nicht implizit definiert werden, und angenommen das soll auch so sein (Klasse ist halt nicht kopierbar). Dann reicht mir die Info "Default-Ctor kann nicht implizit definiert werden" nicht. Irgendwo im Programm versucht jmd. den Default-Ctor zu verwenden, und diese Stellen muss ich finden. Wenn ich die mit Hand suchen muss, wäre das lästig. Also der Hinweis vom Compiler, welches Stück Code den Versuch getriggert hat den Default-Ctor zu erstellen.



  • @hustbaer: Danke für die Erklärung.
    @volkard: Ja die Zeile steht bei mir auch drin und wenn ich die zeile zum testen eingebe wird die auch erkannt. Ich weiß nicht was da dann nicht passt.
    Vielleicht ist da in meinen configs was durcheinander geraten.



  • Wenn man die Nachricht alleine eingibt, dann passt es.
    Die vollständige Zeile passt aber nicht mehr, z.B.:
    main.cpp:11:10: note: synthesized method ‘_Type::_Type()’ first required here

    Das dürfte daran liegen, dass sie vorher von der "Preprocessor error"-Regexp als Fehler eingestuft wird:
    ([][{}() \t#%$~A-Za-z0-9_:+/\.-]+):([0-9]+):[0-9]+:[ \t](.*)

    Wenn man die Reihenfolge tauscht, geht es wieder.


Anmelden zum Antworten