inline-Funktionen verschleiern?



  • Morgen zusammen,
    Habe da ein Problem. Und zwar hätte ich gerne inline-Funktionen in einem namespace. Diese sollen aber nicht im Header implementiert werden sondern in dem sourcefile.

    Aus diesem Code:

    // Test.h
    namespace Test
    {
      inline int Test(void) {
        return 20; // geile Funktion, ich weiß ;-)
      }
    }
    

    Möchte ich diesen machen:

    // Test.h
    namespace Test
    {
      inline int Test(void);
    }
    
    // Test.cpp
    inline int Test::Test(void) {
      return 20; // geile Funktion, ich weiß ;-)
    }
    

    Ich habe den dumpfen Verdacht das geht nicht. Wenn jemand trotzdem nen Weg kennt wäre ich sehr dankbar...



  • Ehm, ich hab das jetzt so gelöst und das funzt auch...

    // Test.h
    namespace Test
    {
      extern inline int Test(void);
    }
    
    // Test.cpp
    extern inline int Test::Test(void) {
      return 20; // geile Funktion, ich weiß ;-)
    }
    

    Bringt das performancetechnisch überhaupt was und ist der Style sauber (Standardkonform/empfehlenswert)? Ich hab sowas in der Art nämlich noch nirgendwo gesehen... 😉



  • mach dir eine Datei zum beispiel Test.inl. dort machst du die methoden rein und inkludedst dann Test.inl in deinem Header



  • @<Martin>
    Das ist auch ne Möglichkeit. 😉

    @all
    Wäre es denn erlaubt das ganze mit dem extern-Keyword zu regeln oder bringt mir das irgendwelche Nachteile???



  • dürfte unportabel sein und ob er wirklich inlinet ist dann auch ne frage



  • Für die Geschwindigkeit kann es allerhöchstens was bringen, wenn Du
    #include "test.cpp" //sic!
    in Deine cpp-Datei, welche die Test()-Funktion benutzt, mit aufnimmst.
    In der "test.cpp"-Datei solltest Du m. E. auf das "extern" verzichten.



  • extern und inline beißen sich irgendwie.



  • thx @all



  • extern und inline beißen sich irgendwie

    Wieso? extern und inline können völlig legal direkt nebeneinander stehen.

    Früher hatte eine inline-Funktion automatisch static (also internal)-linkage. In Standard-C++ hingegen hat eine inline-Funktion (wie jede andere auch) automatisch external linkage. Das extern ist also überflüssig. Zwischen:

    inline void Bla();
    

    und

    extern inline void Bla();
    

    besteht also kein Unterschied.

    extern hat ansonsten mit inline aber nix weiter zu tun. Insbesondere ändern sich dadurch nicht die Regeln die für inline-Funktionen gelten. Sprich: Die *Definition* einer inline-Funktio/Methode muss in *jeder* Übersetzungseinheit sichtbar sein, in der die entsprechende Funktion/Methode aufgerufen wird.



  • Nunja, das Standardkommitee wird sicherlich einen Grund gehabt haben, inlines extern zu machen. Mir verschließt der sich allerdings. Irgendwelche Ideen?



  • Original erstellt von Bashar:
    Nunja, das Standardkommitee wird sicherlich einen Grund gehabt haben, inlines extern zu machen. Mir verschließt der sich allerdings. Irgendwelche Ideen?

    vielleicht damit der meyers-singleton besser klappt und nicht so viele drucker im system rumalbern?



  • Versteh ich nicht.



  • Hallo,
    hätten inline-Funktionen internal linkage, würde jedes in einer solchen Funktion als statisch deklariertes Objekt mehrfach existieren (einmal pro ÜE).
    Eine getInstance()-Methode nach dem Meyers-Singleton dürfte also nicht inline sein.

    Zudem würde außerdem das nicht inlinen eine inline-Funktion dazu führen, dass mehrere Definitionen einer Funktion generiert werden würden.


Anmelden zum Antworten