Inline-Funktionen aus statischer Lib nicht-inline machen
-
Ich hab ne statische Lib von nem Fremdhersteller mitsamt den Headern:
Der sieht im Prinzip so aus:class A { public: void foo(); void bar() //inline-Funktion { //... } };
Jetzt würde ich gern (um die Abhängigkeiten zu verringern und schneller zu kompilieren) das ganze inline-Zeugs rausschmeißen und es in ne cpp-Datei packen.
Ich würde also den Header so ändernvoid bar(); //keine inline-Funktion mehr
und den Code von bar in ein cpp-File packen.
Die compilerten Libs, die ich hab, will (und kann) ich nicht neu kompilieren.Kann man das machen, oder sind da komische Laufzeitfehler zu erwarten?
-
Kann man das machen, oder sind da komische Laufzeitfehler zu erwarten?
Schau doch mal nach, ob die Lib für die entsprechenden Funktionen externe Symbole enthält. Sollte dies nicht der Fall sein, sehe ich kein Problem. Was aber nicht sonderlich viel heißt, da ich mich mit dieser Thematik nicht so auskenne
-
ok, kann auf Anhieb nix finden (weiß aber auch nicht sicher in welcher der LIBs es sein sollte).
Wären aber externe Symbole für die inline-Funktionen vorhanden, müsst ich doch nen Hinweis vom Linker kriegen (Warnung oder so), da die Funktionen zweimal definiert wären, oder?Außerdem würd das ja auch ohne das ich was ändere zu Problemen kommen, weil die inline-Funktionen in meinem Projekt neu übersetzt und gelinkt werden, oder?
Was aber nicht sonderlich viel heißt, da ich mich mit dieser Thematik nicht so auskenne
Schon klar, dass es mir wahrscheilich keiner sicher sagen kann, aber wenn Ihr derselben Meinung seid wie ich ("dürfte funzen") kann ichs mal versuchen (ist ziehmlich viel Code und wahrscheinlich ist es nicht so einfach einen Fehler festzustellen). Wenn Ihr aber sagt "Finger weg", brauch ichs erst garnicht probieren
-
Wären aber externe Symbole für die inline-Funktionen vorhanden, müsst ich doch nen Hinweis vom Linker kriegen (Warnung oder so), da die Funktionen zweimal definiert wären, oder?
Theoretisch. Aber nur, wenn du exakt den selben Compiler verwendest wie der Hersteller der Lib. Unterscheidet sich z.B. das name mangling, dann hast du aufeinmal zwei Definitionen der selben Funktion, die aber zu unterschiedlichen Symbolen werden -> kaum erkennbare ODR-Verletzung.
Aber auch wenn deine Lib keine out-of-line-Definition enthält, ist das sicher nicht unproblematisch: In diesem Fall bekommst du ein Problem, wenn du in zwei Monaten die Funktion veränderst, dabei aber vergisst, dass dies eigentlich mal ne inline-Funktion war. Dann hast du auf jeden Fall auch eine ODR-Verletzung.