#ifdef -> einrücken oder nicht?



  • 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


Anmelden zum Antworten