inline und linker error



  • Hi

    Fast immer wenn ich inline verwende bekomme ich linker error und ich weiß nicht warum. Ich definiere z.B. in einer Header datei die Funktionen

    void WriteLog(char *a);
    void WriteInttoLog(int a);

    In die cpp datei schreibe ich dann den Code

    void WriteLog(char*a){
    ...
    }
    void WriteInttoLog(int a){
    ...
    }

    Wie kann ich diese Funktionen als Inline definieren? Immer wenn ich es versuche bekomme ich Linker errors



  • Inline-Funktionen müssen sich ebenso wie Template-Funktionen komplett im Header befinden. Im Standard gibt es zwar das Schlüsselwort export. Dieses wir aber bislang von kaum einem Compiler unterstützt.



  • Im Standard gibt es zwar das Schlüsselwort export.

    Das allerdings überhaupt nichts mit inline zu tun hat.



  • Hi!

    Vielleicht noch ein kleiner Tip:

    Wenn diese Funktionen nicht von anderen Modulen aufgerufen werden müssen, dann kannst Du diese auch inline in der cpp-Definieren. Besser ist es die Definitionen dann nicht im Header zu führen, oder das Wort "static" anzuwenden. Es sollte jedoch noch eine Möglichkeit mit unbenannten namespaces geben, die static abgelöst haben.

    Greetz
    Richie



  • static und inline, wiederspricht sich das nicht irgendwie ?!?



  • Im Sinne von statischer Variable: Ja (seeehr böse)

    In C galt static auch als Schlüsselwort für Funktionen, deren Sichtbarkeit nur im aktuellen Modul vorhanden ist.

    Bin zum erstenmal in den Linux-Kernel-Quellen über die Syntax "static inline..." gestolpert.

    Wie gesagt, wurden meines wissens durch unbenannte Namespaces abgelöst. Heisst jedoch nicht das static-inline ein syntaktischer Fehler in C++ ist.

    Greetz
    Richie



  • Original erstellt von HumeSikkins:
    [quote] Im Standard gibt es zwar das Schlüsselwort export.

    **
    Das allerdings überhaupt nichts mit inline zu tun hat.**[/QUOTE]
    Nicht? Ich dachte das gilt für templates wie auch für inline... Naja, so kann man sich täuschen 😉 .



  • Im Sinne von statischer Variable: Ja (seeehr böse)

    Das ist so nicht ganz korrekt. Die Zeiten in der inline-Methoden internal-linkage hatten sind längst vorbei. In Standard-C++ haben inline-Methoden external-linkage (falls nicht anders angegeben). Es gibt also immer nur genau eine und damit auch nur genau einmal die statischen Variablen.
    Einige Compiler machen das aber nach wie vor falsch. Insofern würde
    ich auch auf jeden Fall davon abraten statische Variablen in einer inline-Funktion zu verwenden.

    Heisst jedoch nicht das static-inline ein syntaktischer Fehler in C++ ist.

    Richtig. static und inline sind zwei orthogonale Konzepte. Das static beschränkt die Sichtbarkeit der Funktion auf die entsprechende ÜE. Das inline sorgt dafür, dass ein Funktionsaufruf in dieser ÜE inline expandiert werden kann.



  • Original erstellt von <Richie_Gecco>:
    Es sollte jedoch noch eine Möglichkeit mit unbenannten namespaces geben, die static abgelöst haben.

    jo, man soll lieber

    namespace {
     void foo(void) {
       //...
     }
    }
    

    anstelle von

    static void foo(void) {
      //...
    }
    

    benutzen.


Anmelden zum Antworten