inline führt zu Linker-Fehler



  • Hallo,

    ich habe eine simple set-Methode, die etwa so aussieht:

    Header:

    void setX( Pointer<XTyp> x );
    

    Implementation:

    inline void Objekt_mit_X::setX( Pointer<XTyp> x )
    {
    	x_attribut = x;
    }
    

    Das ging bisher ganz gut. Nachdem ich an ganz anderer Stelle was geändert habe,
    geht es nicht mehr. VC++6 meldet "unresolved external symbol".
    Das darf doch eigentlich nicht sein, oder? Sobald ich inline entferne, geht's.

    Danke.



  • Inline sagt Deinem Compiler, dass er keine Methode erzeugen, sondern den Code direkt dort einsetzen soll wo Du die inline-Methode aufrufst. Daraus folgt dass die inline-Deklaration entweder in der Headerdatei stehen und diese von allen Compileeinheiten inkludiert werden muss, oder dass der Rumpf der inline-Methode nur in dem enthaltenden C-File bekannt ist.

    Anders gesagt: Wenn im Header keine Inline-Angabe steht, und der Compiler den Rumpf der Methode noch nicht "gesehen" hat, nimmt er an die Methode versteckt sich in irgendeiner anderen Compileeinheit.



  • Hmm, das leuchtet in der Tat ein.
    Irgendwo hatte ich gelesen, daß Methoden im Header generell als inline
    angenommen werden. Wenn sie dann eh' in den Header rein müssen, ist ja
    "inline" kaum noch nötig.

    Vielen Dank!



  • stimpleton schrieb:

    Irgendwo hatte ich gelesen, daß Methoden im Header generell als inline
    angenommen werden.

    Das gilt nur für Funktion, die direkt in der Klasse definiert sind.

    class foo
    {
        void bar()
        {
            //...
        }
    ];
    

    Obwohl bar nicht explizit mit inline gekennzeichnet ist, wird es implizit so behandelt.



  • So weit ich mich erinnere, entscheiden manche Compiler aber autark, ob er eine Methode wirklich "inline" compilieren oder nicht. "inline" oder auch das Schreiben von Methodencode in den Header ist sozusagen nur ein Vorschlag.



  • Das ist zwar richtig, hat aber nichts mit dem Thema zu tun.




Anmelden zum Antworten