inline funktionen / header-only lib / ODR
-
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 nehmendie 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?
-
Informationen stammen von:
ISO/IEC 9899 Abschnitt 6.7.4 Function specifiers http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
Weiter dazu im rational http://www.open-std.org/JTC1/SC22/WG14/www/C99RationaleV5.10.pdf
http://gustedt.wordpress.com/2010/11/29/myth-and-reality-about-inline-in-c99/
http://stackoverflow.com/questions/5229343/how-to-declare-an-inline-function-in-c99-multi-file-projectSowie Ausprobieren mit clang 3.2 und gcc 4.7.3 auf x86_64
-
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.