inline und linker
-
Original erstellt von <der linker>:
eigentlich du. solange du die ODR einhältstwie kann ich sie einhalten wenn ich die inline funktion in header definieren muss?
-
hm? solang du sie nicht in 2 headern definierst sollte doch alles passen?
-
falls ich dumpfsinn poste. ich bin zu deprimiert und kann anscheinend nichts. mein bester freund lässt mich im stich und niemandem bin ich wichtig. das alle bringt mich zum kotzen und hängt mir schon so zum hals heraus.
aber ok...die odr sagt:
datei1.cpp
struct x { blub; }datei2.cpp
struct x { blub; }x bezieht sich auf dieselbe struktur
dasselbe gilt doch auch für inline funktionen, oder?
in jedem unit, in dem du sie haben willst, muss sie follständig definiert sein.
und das geschieht normailerweise über eine gemeinsame header datei
-
bei inline funktionen ist es anders!
eine inline funktion (sofern sie auch wirklich geinlint wird) hat mit dem linker nix zu tun.
eine inline funktion muss in jeder ÜE in der sie gebraucht wird vorhanden (definiert) sein, da der Compiler sie einfach inline einsetzt (wie ein makro)
mehrfach definition einer inline funktion kann eigentlich nur durch fehlen von include guards erklärt werden (zumindest fällt mir jetzt nix anderes ein)
selbst wenn eine inline funktion nicht geinlint wird, so gilt IMHO das oben genannte - mit ausnahme, dass der compiler sie nicht inline ersetzt und der linker doch zum einsatz kommt.
-
danke, so dachte ich mir das auch, ich werd mal kucken obs an irgend einer compilier einstelung lag
-
wie kann ich sie einhalten wenn ich die inline funktion in header definieren muss?
Äh. Die ODR beschreibt unter anderem gerade das. ODR heißt ja nicht, dass man alles immer nur einmal definieren darf. Die ODR beschreibt, was einmal für die die verschiedenen C++ Konstrukte bedeutet.
Und für inline-Funktionen bedeuetet das:
Genau einmal in jeder Übersetzungseinheit die die entsprechende Funktion benutzt (aufruft oder deren Adresse bildet). Jede Definition muss dabei tokenweise identisch sein.[ Dieser Beitrag wurde am 28.03.2003 um 11:48 Uhr von HumeSikkins editiert. ]
-
Hast du deine header-Datei auch per #ifndef und #define gegen Mehrfach-Einbindung geschützt? Oder hat das nichts damit zu tun?
-
Oder hat das nichts damit zu tun?
Doch sicher. Eins steht definitiv fest. Egal ob Klasse, Funktion oder Template. Nix darf in einer Übersetzungseinheit *mehrfach* definiert werden.
Wenn du also eine inline-Funktion in einem Header ohne include-Guards definierst und dieser Header wird *mehrfach* in die selbe UE eingebunden, dann ist dies eine Verletzung der ODR.
-
Nur hat das, wenn mich nicht alles täuscht, recht wenig mit dem _Linker_ zu tun. Falls die ODR verletzt ist, sollte der Compiler meckern. (Oder?!)
Also bei mir kommen Linker-Probleme bei iniline-Funktionen meistens schlicht daher, daß ich das "inline" vergessen habe.Stefan.
-
Falls die ODR verletzt ist, sollte der Compiler meckern. (Oder?!)
Nö. Das ist eine QOI-Sache. Der Standard schreibt nicht für alle Verletzungen eine Meldung vor. Bei den meisten mir bekannten Systemen haben ODR-Verletzungen drei mögliche Auswirkungen:
1. Meldungen durch Compiler bei Mehrfachdefinition in einer ÜE.
2. Linkerfehler mit dem Hinweis auf mehrfach oder nicht definierte Symbole.
3. Schweigen im Walde. Auf deutsch: Undefiniertes Verhalten ohne Meldung.Drittens passiert normalerweise bei unterschiedlichen Definitionen der selben inline-Funktion.
-
QOI-Sache -> QOI ?
-
Quality of implementation