Compilerwarnungen Clang / gcc



  • Ich habe mir mit https://www.youtube.com/watch?v=zMrP8heIz3g&index=6&list=PLs3KjaCtOwSbij6EOk7K-ZgKKcxH7yVHC Visual Studio Community 2017 installiert und mein aktuelles Projekt irgendwas mit W4 (? finde die Compilereinstellungen nicht mehr) kompiliert. Die Warnungen beseitigt und dann noch mal mit Tidy-Code und soweit dessen Warnungen beseitigt.

    Dann die Source-Files in ein Projekt in CodeBlocks kopiert und mit gcc kompiliert (finde ich jetzt auch nicht die Versionsangabe) und zwar mit
    [Wall]
    [-Weffc++]
    [-Wextra]
    und soweit diese Warnungen beseitigt.

    Bei einigen Warnungen wußte ich nicht warum und wie ich sie beseitigen soll.
    In Tidy-Code dieser Konstruktor

    Charset( const std::string& name ) : charset_name( name )
    {
        readCharset( charset_name );
    }
    

    Clang:pass by value and use std::move Wo ich nicht wirklich weiß, was das bedeutet und sonst bei allen Funktionsprototypen Clang:all parameters should be named in a function . Warum soll man das bei Prototypen machen?

    In gcc wird ausschließlich unter [-Weffc++] beinahe jede Klassenmembervariable angemeckert, die nicht im Konstruktor initialisiert wird.
    warning: ... should be initialized in the member initialization list [-Weffc++]|

    Beispiel diese einfache Klasse, die ein einfaches AsciiArt einliest und ausgibt:

    class AsciiArt
    {
    
    public:
    
        AsciiArt ( const std::string& name ) : artname( name )
        {
            readArt( artname );
        }
    
        std::size_t getSize() const;
        int getWidth() const;
        int getHeight() const;
        void printArt( int, int, WORD, WORD );
    
    private:
    
        std::string artname;
        int width = 0;
        int height = 0;
        std::vector<std::string> char_rows;
        void readArt( const std::string& );
    };
    

    Dort wird char_rows angemeckert. Das ist ein vector aus strings der in readArt() gefüllt wird, wobei der string einfach nur eine Zeile der AsciiArt ist. Wie sollte ich das ändern und sollte ich überhaupt?

    Danke.



  • Inzwischen glaube ich, das eine gute Antwort auf solche meiner Fragen wäre:
    "Warts ab! Wirst es schon merken." 😉

    Wenn man auch bei Prototypen die Variablen bezeichnet, erkennt man gleich viel besser, was sie tun sollen und dieser komische Konstruktor fiel weg, weil die Klasse schon deprecated war und neu gemacht werden musste.



  • @lemon03 sagte in Compilerwarnungen Clang / gcc:

    Clang:pass by value and use std::move Wo ich nicht wirklich weiß, was das bedeutet

    Der Vorschlag ist:

    Charset( std::string name ) : charset_name( std::move(name)) ...
    

    Siehe zum Beispiel hier: https://abseil.io/tips/117

    Das kann, muss aber nicht immer sinnvoll sein. Nicht jede Warnung ist auch ein Fehler. Insbesondere wenn du alle checker von clang-tidy aktivierst, gibt es auch diverse stilistische Dinge.



  • Aha, danke 🙂

    Ich fand das deswegen etwas beeindruckend, weil diese Klasse mir schon lange ein Dorn im Auge war und clang mich nur noch mal daran erinnern wollte. Denn andere Klassen in dieser Form blieben ja unbeanstandet.

    Nochmal danke für die Korrektur, ich nehme immer jede Zeile mit, auch wenn ich sie nicht gleich verarbeiten kann 🐶