inline function Fehlermeldung



  • CheckersGuy schrieb:

    Auch wenn das so ist, würde mich trotzdem noch interessieren, warum obiger code dann nicht compiliert wird...

    SeppJ schrieb:

    Wie man Probleme nachstellbar und nachvollziehbar macht

    Dein Interesse scheint dann ja eher begrenzt zu sein ...



  • CheckersGuy schrieb:

    Kann mir jemand erklären, wie man das inline keyword richtig verwendet?

    Für "normale" Funktionen und inline -Funktionen gelten unterschiedliche Regeln. Die ODR (One-Definition-Rule) behandelt diese Funktionen anders. Diese Regeln begünstigen es, dass ein Compiler beim separaten Übersetzen von Übersetzungseinheiten, Funktionen relativ leicht "inlinen" kann; denn die ODR sagt, dass die Definition einer inline-Funktion in jeder Übersetzungseinheit vorhanden sein muss, in der die Funktion verwendet/aufgerufen wird. Man definiert inline-Funktionen typischerweise im Header, wenn sie mehreren ÜEs zur Verfügung gestellt werden. Definition und Deklaration kannst Du bei Funktionen so unterscheiden:

    void foo();  // Deklaration
    
    void foo() { // Definition
       ...
    }
    

    Funktionen können auch implizit inline sein, also inline, ohne dass man das inline-Schlüsselwort benutzt. Jede Funktion, die innerhalb der Klassen-Definition definiert wird, ist automatisch inline. Das heißt, Du könntest das so aufschreiben:

    class something_chess_related_we_havnt_been_told_about
    {
    public:
        uint32_t captures=0,kingCaptures=0;
        uint16_t encoding=0;
        Move(uint8_t from, uint8_t to);
        Move();
        bool isCapture();
        uint8_t getFrom();
        uint8_t getTo();
        bool isPromotion();
        bool isEmpty();
        uint8_t getPieceType() { return (1024 & this->encoding) >> 10; }
        uint8_t getMoveIndex();
        void setMoveIndex(uint8_t index);
        void setFrom(uint8_t from);
        void setTo(uint8_t to);
        void setPieceType(uint8_t type);
        void print();
        bool equals(Move comp);
    };
    

    Oder so:

    class something_chess_related_we_havnt_been_told_about
    {
    public:
        uint32_t captures=0,kingCaptures=0;
        uint16_t encoding=0;
        Move(uint8_t from, uint8_t to);
        Move();
        bool isCapture();
        uint8_t getFrom();
        uint8_t getTo();
        bool isPromotion();
        bool isEmpty();
        inline uint8_t getPieceType();
        uint8_t getMoveIndex();
        void setMoveIndex(uint8_t index);
        void setFrom(uint8_t from);
        void setTo(uint8_t to);
        void setPieceType(uint8_t type);
        void print();
        bool equals(Move comp);
    };
    
    uint8_t something_chess_related_we_havnt_been_told_\1::getPieceType() {
        return (1024 & this->encoding) >> 10;
    }
    

    (wobei beides im Header stehen würde)



  • krümelkacker schrieb:

    Jede Funktion, die innerhalb der Klassen-Definition definiert wird, ist automatisch inline. Das heißt, Du könntest das so aufschreiben: [2 Beispiele]

    Warum ist das im 2. Beispiel von dir der Fall? Ich dachte bislang, da müsse inline stehen.


  • Mod

    wob schrieb:

    krümelkacker schrieb:

    Jede Funktion, die innerhalb der Klassen-Definition definiert wird, ist automatisch inline. Das heißt, Du könntest das so aufschreiben: [2 Beispiele]

    Warum ist das im 2. Beispiel von dir der Fall? Ich dachte bislang, da müsse inline stehen.

    Wie krümelkacker schon sagte: Es ist automatisch der Fall. Nach den Regeln der Sprache. Wäre auch ziemlich schlecht, wenn es nicht so wäre, denn schließlich kann und soll eine Klassendefinition in mehreren Übersetzungseinheiten verwendet werden. Also muss sowieso alles, was darin definiert ist, inline sein. Dann kann man es auch gleich implizit so machen.



  • Aber beim 2. Beispiel steht die Definition der Funktion ja eben nicht in der Definition der Klasse.

    I see ... das inline ist in der Klassendefinition enthalten. Ist mir zuerst entgangen.


  • Mod

    theta schrieb:

    Aber beim 2. Beispiel steht die Definition der Funktion ja eben nicht in der Definition der Klasse.

    Da steht aber auch explizit inline dran!



  • Ja, habe ich auch bemerkt, siehe Edit.



  • Vielleicht der Grund, warum mir das unklar ist:
    Die #include's werden doch vom Präprozessor einfach reinkopiert. D.h. wie unterscheidet sich das
    [code="cpp"]uint8_t something_chess_related_we_havnt_been_told_\1::getPieceType() {
    return (1024 & this->encoding) >> 10;
    }[/code]
    das hier im Header steht, davon, dass es in der .cpp-Datei stehen würde? Wieso gibt das keinen Fehler? Ich verstehe dein Argument bzgl. Klassendefinitionnicht, denn das ist ja keine Klassendefinition, sondern eine Funktionsdefinition.

    Edit:
    ach du sch... ich habe das inline ebenfalls nicht gesehen.

    Wenn ich sowas mache, setzte ich das inline vor die Implementierung!

    Edit2: der Grund für das nicht-sehen ist, dass hier viele weitere irrelevante Dinge in der Klassendefinition stehen, sodass ich einfach 2x class{large blob}; gelesen habe und gar nicht auf die Idee gekommen bin, dass Krümelkacker da ein "inline" hineingekackt 😉 haben könnte.



  • SeppJ schrieb:

    theta schrieb:

    Aber beim 2. Beispiel steht die Definition der Funktion ja eben nicht in der Definition der Klasse.

    Da steht aber auch explizit inline dran!

    Reicht das echt wenn das bei der Klassendefinition steht, und die Funktion dann ohne inline definiert wird?
    Ich hab die Variante nämlich auch noch nie gesehen...


  • Mod

    hustbaer schrieb:

    SeppJ schrieb:

    theta schrieb:

    Aber beim 2. Beispiel steht die Definition der Funktion ja eben nicht in der Definition der Klasse.

    Da steht aber auch explizit inline dran!

    Reicht das echt wenn das bei der Klassendefinition steht, und die Funktion dann ohne inline definiert wird?
    Ich hab die Variante nämlich auch noch nie gesehen...

    Es sollten alle Kombinationen funktionieren: inline bei Deklaration, inline bei Definition, inline bei beiden.


Anmelden zum Antworten