Zieht ihr das voll durch? Trennung zwischen Header- und Sourcedateien.
-
muffmolch schrieb:
mit vc funktioniert das bsp. jedenfalls! und "shall" ist nicht "has to".
Seltsam. Manchmal legt der Compiler noch eine nicht geinlinete Version ab, wenn man beispielsweise die Adresse der Funktion für einen Funktionspointer benutzt. Vielleicht macht der VC das (bei deinen Einstellungen?) auch so, und deshalb findet der Linker die Definition.
BTW "shall" heißt "muss" im Sprachgebrauch des Standards.
-
also auch der gcc 3.x und 4.x und die intel compiler meckern nicht.
aber wie auch immer. das wesentliche, was ich mir nun merke ist:
"inline" methoden muessen immer im header definiert sein, wenn man sie wirklich inlinen moechte. ein inline in der source datei ist nur dann sinnvoll, wenn die funktion ausschließlich und nur dort verwendet wird. ansonsten würden std-konforme compiler fehlermeldungen liefern.back @topic:
da inline funktionen/methoden oft einen performanteren Code liefern und diese, wie der kleine Exkurs gezeigt hat, im Header definiert sein muessen, macht eine 100%ige Aufteilung von Deklaration im Header und Definition in der Source-Datei keinen Sinn.
-
ohne jetzt nachzusehen, tippe ich wiedereinmal darauf, dass der standard meint (wie so oft bei fehlern, die mehrere übersetzungseinheiten betreffen): "no diagnostics required".
-
Bashar schrieb:
BTW "shall" heißt "muss" im Sprachgebrauch des Standards.
naja eigentlich heißt shall sollen, also eher noch eine möglichkeitsform als es bei muss der fall ist.
-
Fake oder Echt schrieb:
Bashar schrieb:
BTW "shall" heißt "muss" im Sprachgebrauch des Standards.
naja eigentlich heißt shall sollen, also eher noch eine möglichkeitsform als es bei muss der fall ist.
Eigentlich, aber nicht im Standard
Du kannst es lesen als "X soll Y erfüllen, sonst ist X kein konformes Programm bzw. keine konforme Implementierung".
-
dann sind inline methoden irgendwie nur bei template-funktionen noetig (dort muss man sie, wenn man sie ausserhalb der klassendeklaration definiert, mit inline versehen, ansonten werden sie wie nicht inline funktionen behandelt. denn wen ich das richtig gesehen habe, so sind std-mäßig alle methoden, die im Header definiert werden zugleich inline...
stimmt das? wozu dann überhaupt inline?
-
nein, "standardmäßig" sind alle funktionen inline, die in einer klassendefinition definiert werden. alle anderen sind nicht inline. globale funktionen sind nicht inline (vor allem nicht, wenn man sie in einem header definiert), ebensowenig template-funktionen.
dann sind inline methoden irgendwie nur bei template-funktionen noetig
was meinst du damit?
inline hat auswirkungen auf zwei ebenen: einerseits ist es ein hinweis für den compiler, funktionsaufrufe durch die direkte ausführung des codes in der funktion zu umgehen (aber nur ein hinweis, kein muss!), andererseits ändert inline die regeln bezüglich der einmaldefinierung von funktionen. (konkret: du kannst inline-funktionen sooft definieren wie du willst, _aber_: du musst sie auch immer definieren, wenn du sie verwendest)
-
okay. ich meinte jetzt ausschließlich klassenmethoden.
wie ist es beim vorherigen Bsp://Klasse.h class Klasse { public: inline void foo() {} //hier es überflüssig, da es implizit gesetzt wird void foo2(); }; void Klasse::foo() {} //bisher dacht eich, dass diese methode ebenfalls implizit inline ist, ist sie das nicht?ds mit den templtes hatt eich falsch in Erinnerung, das galt für template methoden... nicht für Klassen...
[/cpp]
-
BugJoe schrieb:
Wie macht ihr das denn? Zieht ihr das voll durch und trennt jede Pupsklasse in Header- und Sourcedatei? Oder überkommt es euch auch hin und wieder und ihr schreibt die Implementierung komplett in die Headerdatei? Gibts da ggf. sogar irgendwelche offiziellen Richtlinien?
Um auf die Ursprungsfrage wieder zurückzukommen. Ich benutze überhaupt keine inline. Einerseits ist mir auch bekannt, dass getter & setter ohne Probleme im Header implementiert werden können. Andererseits kann es auch passieren, wenn z. Bsp. alles im Header für inline erklärt wird, der Code langsamer wird.
Sollte ich doch mal in die Versuchung kommen Funktionen inline zu machen, dann würde ich mit einem Profiler versuchen, erstmal herausfinden wo meine Programm sich am häufigsten befinden (20:80 Regel) und an diesen Stellen den Code performant zu bekommen.
Gruß
Markus
-
queer_boy schrieb:
andererseits ändert inline die regeln bezüglich der einmaldefinierung von funktionen. (konkret: du kannst inline-funktionen sooft definieren wie du willst, _aber_: du musst sie auch immer definieren, wenn du sie verwendest)
Das gilt vielleicht für verschiedene Übersetzungseinheiten, aber innerhalb einer Übersetzungeinheit darfst du sie trotzdem nur einmal definieren...
Felix