GCC und inline
-
hat jemand das folgendes Problem geloest?
in einmem module (sag module A):// h-File: struct A { // Deklartion inline void func (); } // CPP-File void A::func () { ... // Implementierung }
In anderem (module B):
... A a. a.func ();
Manchmal, habe ich linker-Feheler das sagt das A::func() ist nicht gefunden. Ohne inline ist es Ok. Ich addiere Option -Winline und bekomme Warnung das Compiler kann A::func inline nicht machen!!! Dast ist selbst Ok, aber warum denn ist es nicht normalweise implementiert im Module B???
Villeicht ist es wegen unabhaengigen Compiliring von Modulen A und module B. Naemlich, nach der Compilirung von module A weiss GCC nicht dass es A::func im module B inline nicht machen koennen! Dabei ist A::func inline deklariert und ohne Gebrauch im module A nicht produziert wird. Und wann es zu linken kommt ist A::func wirklich abwesend!
Aber wie kann ich diese Fehler normalweise wegmachen? ohne inline zu "loeschen"?
-
itman schrieb:
Aber wie kann ich diese Fehler normalweise wegmachen? ohne inline zu "loeschen"?
Das inline innerhalb der Klasse (bzw. struct) solltest du auf jeden Fall weg machen, da es für den Compiler keinen wirklichen Sinn macht und dann solche Konflikte entstehen. Soll die Funktion nicht geinlined werden, dann kommt sie ins .cpp file (so wie du's gemacht hast). Ansonsten definierst du sie im header file (oder einer anderene Datei zb .inl die du im header einbindest). Dann musst du aber explizit inline angeben, da sonst eine ODR Verletzung provoziert wird.
// h-File: struct A { // Deklartion void func (); } inline void A::func () { ... // Implementierung }
-
O, danke dass wusste ich nicht