inline funktionen / header-only lib / ODR



  • hallo,

    um bei header-only-funktionen keine linker-fehler zu bekommen, setzt man in c++ ja einfach ein inline vor die funktion: inline void foo();
    der msvc(-c-compiler) kennt inline aber offenbar nicht. (error: missing type specifier)
    der gcc compiliert es.

    ich habe einen ziemlich simplen workaround gefunden:

    #if (!defined(__cplusplus) && defined(_MSC_VER) && !defined(inline))
    #	define inline __inline
    #endif
    

    spricht irgendetwas dagegen, das so zu verwenden?

    so weit ich das mitbekommen habe, wurde inline im C99 aufgenommen( 6.4.1 /keywords + 6.7.4 /function specifiers) und der msvc unterstützt das eben einfach nur nicht?
    oder habe ich da was falsch verstanden und es ist eben doch nicht garantiert sondern nur ein feature des gcc?

    wie geht ihr mit header-only funktionen um? oder nutzt ihr einfach keine?

    danke 🙂



  • unskilled schrieb:

    wie geht ihr mit header-only funktionen um? oder nutzt ihr einfach keine?

    Das. Gibt keinen Grund für header-only, das ist unübersichtlich, verlangsamt die Kompilierung und hat keinerlei Vorteile zur Runtime.



  • lonely schrieb:

    unskilled schrieb:

    wie geht ihr mit header-only funktionen um? oder nutzt ihr einfach keine?

    Das. Gibt keinen Grund für header-only, das ist unübersichtlich, verlangsamt die Kompilierung und hat keinerlei Vorteile zur Runtime.

    also zu jeder noch so kleiner funktion, die nicht in irgend nen vorhandenen header passt, erstellt ihr noch zusätzlich zum header ne source datei und linkt die dann noch mit? oder schreibt sie einfach bei jedem projekt neu und packt sie dort irgendwo mit rein, wo sie eher passt als stört^^

    mir ist das zwar (praktisch gesehen) ziemlich egal; weil ich nur eine hausarbeit in C schreiben muss, aber da wollte ich nicht pro aufgabe x source files schicken.

    bb



  • Um in C99 header-only zu bekommen muss die Funktion static inline sein,
    bei der gnu C erweiterung braucht (oder muss k.a.) man nur inline nehmen



  • gary1195 schrieb:

    Um in C99 header-only zu bekommen muss die Funktion static inline sein,
    bei der gnu C erweiterung braucht (oder muss k.a.) man nur inline nehmen

    die behauptung hatte ich auch irgendwo gefunden. (der msvc kennt inline auch so nicht.) allerdings hab ichs beim standard lesen nicht so verstanden.

    der einzige punkt für static inline war, dass der compiler so eher erkennt, dass er die betreffende funktion wirklich inlinen darf (internal linkage vs. external linkage).



  • unskilled schrieb:

    die behauptung hatte ich auch irgendwo gefunden. (der msvc kennt inline auch so nicht.) allerdings hab ichs beim standard lesen nicht so verstanden.

    der einzige punkt für static inline war, dass der compiler so eher erkennt, dass er die betreffende funktion wirklich inlinen darf (internal linkage vs. external linkage).

    Ich denke nicht, dass das der Fall ist.

    In C99 funktioniert es so
    Header f.h:

    #ifndef F_H
    #define F_H
    inline int f(int x) 
    {
    	return x*x;
    }
    #endif
    

    Implementierung f.c:

    #include "f.h"
    extern inline int f(int);
    

    Das Compilat f.o der Implementierung f.c enthält die Definition der Funktion f
    In jeder anderen Datei die f.h includiert entscheidet der Compiler an jeder Stelle an der f verwendet wird, ob er inlined oder nicht.
    Die nicht geinlined Funktionsaufrufe werden (im Normalfall (hängt vom User ab)) gegen f aus f.o gelinkt.

    Vorteil die inline Funktion ist wie nicht inline Funktionen als globales Symbol einmal vorhanden d.h. sie kann auch ohne die Headerdatei aufgerufen werden zB von anderen Programmiersprachen aus, innerhalb von C kann aber geinlined werden.

    Inlining ist Sache des Compilers, der Compiler kann auch gar nicht inlinen.

    Wenn static davor steht, dann hat jede Übersetzungseinheit eine eigene Version der Funktion, der Compiler entscheidet dann, ob er immer inlined und/oder ob er Code für diese Funktion generiert (dadurch kann der Code einer Funktion im fertigen Programm mehrfach vorhanden sein)



  • bezug?





  • ich meinte bezug zum thema... sind halt nur dinge dabei, die ich nicht wissen wollte. nicht mal gefragt habe.

    http://www.greenend.org.uk/rjk/tech/inline.html
    A function defined static inline . A local definition may be emitted if required. You can have multiple definitions in your program, in different translation units, and it will still work. Just dropping the inline reduces the program to a portable one (again, all other things being equal).
    der erste teil erscheint so weit sinnvoll.
    den zweiten verstehe ich nicht so recht. wieso soll static inline jetzt unportabel sein? oder ist dort kompatibilität mit c89? gemeint?
    diese kombination sollte - anders als ich zuerst gedacht hatte - doch die sein, die ich brauche/möchte...



  • Man kann auch den C++ Compiler von MSVC benutzen und programmiert einfach im C-Stil. Dann ueberprueft man seinen Code ab und an mit echten C-Compilern.



  • knivil schrieb:

    Man kann auch den C++ Compiler von MSVC benutzen und programmiert einfach im C-Stil. Dann ueberprueft man seinen Code ab und an mit echten C-Compilern.

    es geht nicht darum, dass ich keine lauffähige version hätte, sondern darum, dass ich gerne wissen würde, ob sie garantiert lauffähig ist - da bringt mir ein c++ compiler genau so viel wie einer für java~~



  • Das hat sich mir aus deinen Posts nicht erschlossen. Vielleicht habe ich was uebersehen.


Anmelden zum Antworten