inline



  • Hallo,
    ich bin anscheinend wirklich zu doof....

    Ich habe ein Programm geschrieben das mit inline funktionen Arbeitet...
    Momentan habe ich einen Header der je nach Optimirungstufe entweder nur Definitionen der Funktionen enthält oder komplett ausprogrammierte funktionen mit Inline.

    Das Problem ist das ich jetzt den Code an 2 Stellen ändern muss...

    Meine Suche bei google ergab das ich folgendermaßen vorgehen soll:
    Im Header die Funktionen als extern definieren und im c-file mit Inline.

    Das Ganze kompiliert auch...
    Wenn ich mir die Funktionsaufrufe mit gprof ansehe wird die Funktion aber dennoch aufgerufen...

    ich compiliere mit gcc C99 unter Opensuse.

    Falls jemand eine Idee hat wäre ich sehr dankbar.

    MfG
    Patrick



  • Mein Glaskugel ist noch auf der Arbeit und Kaffe trinke ich nicht, von daher is tes mit Weissagungen gerade schwierig.

    Also zeig deinen Code, da keiner weiß, wie du das genau gemacht hast.



  • sorry bin auch grad nicht auf der Arbeit. Von daher muss ich das ausm Kopf jetzt machen. Ich bitte Fehler zu verzeihen.

    header:

    #ifndef OPTIMIZATION // Weiss nicht mehr genau wie der Parameter heißt
    
    int add( int a , int b );
    
    #else
    int add( int a , int b )
    {
    
    return 1+b;
    
    }
    #endif
    

    C-File:

    #ifndef OPTIMIZATION
    inline int add( int a , int b )
    {
    
    return 1+b;
    
    }
    #endif
    

    so geht es.... aber da muss ich halt den code doppelt pflegen...

    im Netz habe ich gesehen das es eigentlich auch so gehen sollte:
    Aber dann sehe ich mit gprof das es Funktionsaufrufe gibt.

    header:

    extern int add( int a , int b );
    

    c-file:

    inline int add( int a , int b )
    {
    
    return 1+b;
    
    }
    

    Thx
    Patrick


  • Mod

    Vielleicht suchst du so etwas?

    // Alles im Header
    #define PREFIX inline
    #else
    #define PREFIX static
    #endif
    
    PREFIX int add(int a, int b)
    {
      return a + b;
    }
    

    Besser wäre vermutlich, dem Compiler im Debugfall zu sagen, dass er einfach nie inlinen soll. Jeder Compiler sollte entsprechende Schalter anbieten, sofern er das inline bei unoptimiertem Code nicht sowieso ignoriert. Inline ist in dieser Hinsicht nämlich sowieso eher ein leiser Ratschlag für den Compiler. Die primäre Aufgabe von inline ist hingegen, dass man damit die one-definition-rule aushebeln kann (und zwar besser als mit static).



  • inline ist ab C99 Standard.
    inline ist nur ein Hinweis(Aufforderung) an den Compiler, die Funktion zu inlinen.
    Ob er es wirklich tut, ist implementierungsabhängig.
    Ähnlich wie bei register handelst du dir nur unnütze Abhängigkeiten ein; lass den Compiler allein optimieren, der weiß sowieso 1000x besser als du, ob+wo+was sich sinnvoll optimieren lässt.

    Es ist purer Nonsens, Definitionen gleich welcher Art (außer Typdefinitionen) in Headerdateien anzusiedeln, merke: alles was Code erzeugt oder Speicher belegt, gehört nicht in Header.

    Ich kann den Sinn deiner ifdef nicht sehen, du bist eh (s.o.) vom Compiler abhängig, zusätzlich bist du höchstwahrscheinlich nochmals abhängig davon, ob du im Debug- oder Releasemodus compilierst.
    Und abhängig davon, ob der Compiler etwas optimiert oder nicht, unterschiedlichen Code zu bauen, halte ich erst recht für sinnfrei.


  • Mod

    Wutz schrieb:

    Es ist purer Nonsens, Definitionen gleich welcher Art (außer Typdefinitionen) in Headerdateien anzusiedeln, merke: alles was Code erzeugt oder Speicher belegt, gehört nicht in Header.

    Es ist sinnvoll, wenn man etwas inline optimieren möchte, weil es dem Compiler diese Optimierung damit wesentlich einfacher (bz.w überhaupt erst möglich) macht. Ansonsten könnte das nämlich erst zur Linkzeit optimiert werden, was nicht immer gewünscht/möglich ist. Manchmal muss man sich eben den technischen Realitäten beugen. Daher hat das inline-Schlüsselwort schließlich überhaupt seine andere Bedeutung, da es ohne dies schwer wäre, Funktionsdefinitionen im Header unterzubringen und ohne dass man sie im Header unterbringt, bringt inline nicht sonderlich viel.



  • Also so würde ich es in C++ machen, denke das selbe wird in C auch gehen:

    Foo.h

    void Foo();
    
    #ifdef DO_INLINE_FOO
    #define INLINE_FOO inline
    #include "Foo.inl"
    #endif
    

    Foo.inl

    INLINE_FOO void Foo()
    {
       // ...
    }
    

    Foo.c

    #include "Foo.h"
    
    #ifndef DO_INLINE_FOO
    #define INLINE_FOO
    #include "Foo.inl"
    #endif
    

Log in to reply