inline function Fehlermeldung



  • Hallo,
    ich habe einige Funktionen in meiner Klasse Move, die ich gerne als inline deklarieren würde.

    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);
    };
    

    So sieht die Methode aus, die ich gerne "inlinen" möchte.

    uint8_t Move::getPieceType(){
        return (1024&this->encoding)>>10;
    }
    

    Ich erhalte dann folgende Fehlermeldung

    'uint8_t Move::getPieceType()' used but never defined

    Ich habe versucht, dass inline keyword auch in der dazugehörigen .cpp Datei zu verwenden, ändert aber nichts am Ergebnis.

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

    Gruss

    Robin


  • Mod



  • CheckersGuy schrieb:

    ich habe einige Funktionen in meiner Klasse Move, die ich gerne als inline deklarieren würde.

    Warum?



  • manni66 schrieb:

    CheckersGuy schrieb:

    ich habe einige Funktionen in meiner Klasse Move, die ich gerne als inline deklarieren würde.

    Warum?

    Weil die Funktionen, die ich als inline deklarieren möchte, nunmal sehr klein sind und der Funktionsaufruf Zeit kostet. Bei Performancekritischen Code kann das einen Unterschied machen, sofern der Compiler denn auch so nett ist und mein "inline" berücksichtigt

    Gruss

    Robin



  • CheckersGuy schrieb:

    Weil die Funktionen, die ich als inline deklarieren möchte, nunmal sehr klein sind und der Funktionsaufruf Zeit kostet. Bei Performancekritischen Code kann das einen Unterschied machen

    Das war im letzten Jahrtausend relevant. Heute machen die Compiler das völlig unabhängig von inline immer. Voraussetzung: der Optimizer ist eingeschaltet.



  • manni66 schrieb:

    CheckersGuy schrieb:

    Weil die Funktionen, die ich als inline deklarieren möchte, nunmal sehr klein sind und der Funktionsaufruf Zeit kostet. Bei Performancekritischen Code kann das einen Unterschied machen

    Das war im letzten Jahrtausend relevant. Heute machen die Compiler das völlig unabhängig von inline immer. Voraussetzung: der Optimizer ist eingeschaltet.

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



  • 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.


Log in to reply