#ifdef -> einrücken oder nicht?
-
gruppa schrieb:
ich bräuchte hier nochmal Hilfe. Ich dachte Deklaration und Definition sollten im Header stehen. So bekomme ich aber Konflikte mit multiple definitions...
Ich kenn jetzt nicht den ganzen Thread, aber das hört sich nach Linker-Fehler an. Normalerweise packt man die Deklaration in den Header, die Definition/Implementation in das cpp-File...
-
Ja ich verstehe das Problem und auch Deine Antwort. Ich frage mich nur wie "Shade Of Mine" es jetzt gemeint hat weil er irgendwo geschrieben hat dass er alles in einen header packt...oder meinte er nur die deklaration?
-
gruppa schrieb:
Ja ich verstehe das Problem und auch Deine Antwort. Ich frage mich nur wie "Shade Of Mine" es jetzt gemeint hat weil er irgendwo geschrieben hat dass er alles in einen header packt...oder meinte er nur die deklaration?
Du hast eine ODR Verletzung. Du musst inline verwenden.
-
ah vielen dank - jetzt ists mir klar
-
wollte mich etwas einlesen bezüglich inline und ich lese immer wieder von leuten:
pumuckl schrieb: Alles in allem ist Inlining eine Optimierung, und frühzeitige Optimierungen sind Mist
gilt es jetzt nur darum die ODR zu erzwingen durch inline? wenn ja und inline unter umständen was langsamer machen könnte wäre es viellecht sinnvoller da doch in header und implementierung zu splitten?
Mir ist einfach folgendes nicht klar: Warum sagt der eine es ist Mist, wenn der andere sagt er benutzt es regelmässig.
-
gruppa schrieb:
Mir ist einfach folgendes nicht klar: Warum sagt der eine es ist Mist, wenn der andere sagt er benutzt es regelmässig.
inline hat 2 bedeutungen. inlining von funktionen ist das was pumuckl meint.
das schlüsselwort inline ist aber dazu da um die ODR zu umgehen.siehe: http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=ODR#Answ
-
@shade:
wie löst du wenn du ganze code-teile (funktionen) flag-abhängig haben willst in einer klasse...z.B. sowas?
//implementation der klassen-funktionen von class MyClass void MyClass::foo() { // do something } #ifdef MYFLAG void MyClass::bar() { //do something } #endif
-
gruppa schrieb:
wie löst du wenn du ganze code-teile (funktionen) flag-abhängig haben willst in einer klasse...z.B. sowas?
Ne, ich trenne nur auf Klassen Ebene, nicht innerhalb einer Klasse.
Maximal wenn eine Funktion mit einer bestimmten Konfiguration nicht funktioniert dass ich ein static_assert in die Funktion einbaue.
Aber im Prinzip versuche ich auf sehr abstrakter Ebene zu trennen und lebe durchaus auch mit code verdopplung.
was du aber zB machen koenntest: in der header datei je nach flags andere header dateien inkludieren die die gewuenschte funktionalitaet bereitstellen...
im prinzip ist das ziel, mit #if immer nur #includes zu schachteln und keinen direkten code.
bedenke dass #include nur dumme textersetzung ist, du kannst zB:
class MyClass { #include "myclass_interface_a.hpp" #include "myclass_interface_b.hpp" #include "myclass_interface_c.hpp" };
schreiben..
-
hmm.ok.
mein vorgehen wäre jetzt sowas: ist das so wie du es meintest?
//header MyClass.hpp #include "Impl.hpp" public class MyClass { void foo(); }; //implementation MyClass.cpp zu class MyClass #include "MyClass.hpp" void foo() { //da FLAGabhängig hier einfach die methode Env_foo(); } //und in der Impl.hpp steht dann der switch #ifdef MYFLAG # include Impl_1.hpp #else # include Impl_2.hpp #endif // und z.B. die Impl_1.hpp sieht dann so aus inline void Env_foo() { int a = 7; //do something was nach MYFLAG gehen soll } //und z.B. in der Impl_2.hpp inline void Env_foo() { } //weil hier nix passiert
-
ja