Bedingte Kompilierung für mehrere OS



  • Ob nun Templates oder Impl-Klassen frag ich ja grade im anderen Thread :D, genau das gleiche ist mir nämlich hier gekommen 😉

    MfG SideWinder



  • pimpl oder so, braucht's da auch nicht.

    Einfach nur folgendes:

    // gui.h
    
    #ifdef CURSES
    #include "curses/gui.h"
    #elif DOS
    #include "dos/gui.h"
    #endif
    

    Und configure finde ich an der Stelle viel zu viel. Einfach den Makefile mit make CFLAGS=-DDOS bzw. CURSES aufrufen und gut.

    Aber hauptsache es gibt ne gui.h für jede Plattform und nicht nur eine mit zig ifdefs drin.



  • Weiß nicht warum, gefällt mir aber nicht. Wenn der eine dritte Plattform findet muss der glatt die Headerdatei ändern anstatt einfach schnell noch ne Implementation dazuzuschreiben.

    MfG SideWinder



  • Gegen diese Define-Dinger habe ich überhaupt eine Abneigung entwickelt. Die kann man so schlecht in Namespaces packen und machen dann nur Ärger.

    MfG SideWinder



  • SideWinder schrieb:

    Weiß nicht warum, gefällt mir aber nicht. Wenn der eine dritte Plattform findet muss der glatt die Headerdatei ändern anstatt einfach schnell noch ne Implementation dazuzuschreiben.

    Er muss genau, diesen einen einzigen Header um einen Fall erweitern. Ansonsten wird einfach nur <platform>/gui.h dazu gepackt.

    Eure "OOP-Lösungen" machen eigentlich gar keinen Sinn (d.h ich sehe jetzt keinen). Um ein define, welches man dem Compiler mitgibt damit er nur das richtige kompiliert, kommt man ohnehin nicht rum.

    Gegen diese Define-Dinger habe ich überhaupt eine Abneigung entwickelt. Die kann man so schlecht in Namespaces packen und machen dann nur Ärger.

    Nur wenn man die überall mitten im Code plaziert.



  • DrGreenthumb schrieb:

    Er muss genau, diesen einen einzigen Header um einen Fall erweitern. Ansonsten wird einfach nur <platform>/gui.h dazu gepackt.

    Ok, nicht ganz. Dasselbe nochmal mit gui.cpp.

    Trotzdem, irgendwelche Basisklassen oder Templates sind überflüssig. Einfaches Austauschen der Dateien reicht.



  • gui.cpp hat meistens ein Neukompilieren von Libraries zur Folge.

    BTW: http://www.c-plusplus.net/forum/viewtopic.php?t=80929 hier hat mir Hume gerade erklärt, dass für dich wohl Templates besser wären als diese Impl-Klassen.

    MfG SideWinder



  • SideWinder schrieb:

    gui.cpp hat meistens ein Neukompilieren von Libraries zur Folge.

    Äh, ja, natürlich. Hier geht es doch darum, zu entscheiden für welches OS kompiliert wird.

    Zeig mir mal, wie du das mit den Templates machen willst. Da schreibst du dann

    #ifdef UNIX
    #include unixgui.h
    #endif
    
    int main()
    {
    #ifdef UNIX
        FensterKlasse<Unix> klasse;
    #endif
    }
    

    Das ist doch doppelt gemoppelt und bringt gar nichts.



  • Bezieht sich dein Posting nun auf den Quote oder auf die Templates? 😕

    MfG SideWinder



  • Der erste Satz bezog sich auf das Zitat und das Codebeispiel zeigt, dass Templates hier überhaupt nichts bringen.



  • mittels templates brauch man auch nur an einer stelle einen einzigen parameter verändern, und man kann das ganze prog auf ein andres betriebssystem ausrichten, wenn man ein gutes design hat.
    du musst stattdessen 1000 defines machen...auch nich wirklich schön.



  • Nein, du hast es nicht verstanden. Es sind 2(!) defines und die brauchst du genauso, wenn du zusätzlich noch den Template-Kram rumbaust.

    Probiert das ganze erstmal aus, bevor noch mehr solche Argumente kommen.



  • ich brauch kein define.
    ich ersetze nämlich in der main einfach einen template parameter, das programm kompiliert bei mir dann für ein komplett andres betriebssystem, weil der eine template parameter bewirkt, dass alle andren klassen die benutzt werden auch auf das betriebssystem umgeschaltet werden, dh ich hab in keinem header ein define, ich hab in der main kein define ich hab in keiner cpp ein define, sondern regel alles(!) über ein template(bzw über eine typliste, dann änder ich nur nen typedef)

    Probier das ganze erstmal aus, bevor noch mehr solche Argumente kommen.



  • otze schrieb:

    ich brauch kein define.
    ich ersetze nämlich in der main einfach einen template parameter

    Das will ich sehen. Normalerweise gehören zu einer Klasse auch noch die benötigten Header. Und diese fügst du dann, für jedes Betriebssystem, überall dort ein wo die Klasse benutzt wird? Ganz toll.
    Im übrigen will man keinen Quelltext anfassen müssen, wenn man mal eben für ein anderes BS neu compilieren möchte.

    Probier das ganze erstmal aus, bevor noch mehr solche Argumente kommen.

    Nein, so brauchst du mir nicht kommen. ICH habe nämlich längst die Situtation hinter mir und habe meine Erfahrungen gesammelt.



  • Defines braucht man eigentlich wirklich nicht. Man kann dem Compiler auch sagen, welche Include-Verzeichnisse er nehmen soll und welche Dateien dazukompiliert werden sollen. So kann man die ganzen Entscheidungen einzig und allein dem Makefile überlassen.



  • deine erfahrung und deine 2355 posts ändern aber nix an der tatsache, dass du hier hemmungslos vergisst die edit funktion zu gebrauchen, auch wenn nur wenige secs zwischen den posts liegen 🙄

    btw:

    #include "program.hpp"
    int main{
        executeProgramm<linux>();
        executeProgramm<Windows>();
        executeProgramm<PlatformIndependend>();
        return 0;
    }
    

    was is schlimmer? in sonem code einen parameter zu ändern,oder im projekt die ganzen includes umzuändern?



  • otze schrieb:

    deine erfahrung und deine 2355 posts ändern aber nix an der tatsache, dass du hier hemmungslos vergisst die edit funktion zu gebrauchen, auch wenn nur wenige secs zwischen den posts liegen 🙄

    Was soll der Blödsinn jetzt? Ich habe nicht mit Posts oder Erfahrung angegeben. Ich habe geschrieben, ihr sollt das erstmal ausprobieren weil ihr dann schon feststellen werdet, dass das ganze recht sinnfrei ist. Dann kommst Du und stellst meine Aussage als Unfug dar.

    btw. habe ich das ganz bewusst in einen separaten Post geschrieben.

    btw:

    #include "program.hpp"
    int main{
        executeProgramm<linux>();
        executeProgramm<Windows>();
        executeProgramm<PlatformIndependend>();
        return 0;
    }
    

    was is schlimmer? in sonem code einen parameter zu ändern,oder im projekt die ganzen includes umzuändern?

    Du weißt was templates sind? Du weißt, dass Du dort auch einfach executeProgram_linux() etc. hättest schreiben können? Eigentlich solltest Du dann merken, dass es damit noch nicht getan ist.

    Aber langsam wirds mir zu blöd. Leb ruhig weiter in deinem Irrglauben.
    👎



  • otze schrieb:

    deine erfahrung und deine 2355 posts ändern aber nix an der tatsache, dass du hier hemmungslos vergisst die edit funktion zu gebrauchen, auch wenn nur wenige secs zwischen den posts liegen 🙄

    btw:

    #include "program.hpp"
    int main{
        executeProgramm<linux>();
        executeProgramm<Windows>();
        executeProgramm<PlatformIndependend>();
        return 0;
    }
    

    was is schlimmer? in sonem code einen parameter zu ändern,oder im projekt die ganzen includes umzuändern?

    zeig jetzt bitte deine "program.hpp" Datei, wo keine #define drin sind 😉



  • Er machts ja so:

    #define CURSES
    #include "header.h"
    
    int main ()
    {
        foo_inheader(sonstwas);
        return(0);
    }
    
    // CHANGES FÜR NEUE PLATTFORM:
    #define DOS // Statt #define CURSES
    

    Bloß ist das unübersichtlich, verhindert das Makro DOS (Namespaces sind nicht möglich), ist imho eher C denn C++, muss unbedingt vor dem Include "header.h" definiert sein, etc.

    MfG SideWinder



  • ssm schrieb:

    otze schrieb:

    deine erfahrung und deine 2355 posts ändern aber nix an der tatsache, dass du hier hemmungslos vergisst die edit funktion zu gebrauchen, auch wenn nur wenige secs zwischen den posts liegen 🙄

    btw:

    #include "program.hpp"
    int main{
        executeProgramm<linux>();
        executeProgramm<Windows>();
        executeProgramm<PlatformIndependend>();
        return 0;
    }
    

    was is schlimmer? in sonem code einen parameter zu ändern,oder im projekt die ganzen includes umzuändern?

    zeig jetzt bitte deine "program.hpp" Datei, wo keine #define drin sind 😉

    klar gerne:

    //programm.hpp
    #include "windows.hpp"
    #include "linux.hpp"
    enum BS{//nur hier aus verständnisgründen
        windows,
        linux
    };
    template<BS Type>
    class WindowController{
        private:
            Window<Type> window;
        public:
            typedef Window<Type>::handle handle;
    
            void openWindow();
            void closeWindow();
            handle getWindowHandle();
    };
    template<BS Type>
    class Engine{ 
        private:
            Archive<fileManager<Type> > files;
            baseEngine<Type> engine;
        public:
            //ein paar ctors
            //und nochn paar funktionen
    
            void createNiceEffect();    
    };
    template<BS Type>
    void ProgramExecute();
    
    //program.cpp
    template<BS Type>
    void ProgramExecute(){
        WindowController<Type> a;
        a.openWindow;
        Engine<Type> b(a.getWindowHandle);
        b.createNiceEffect();//wollte ich schon immer mal schreiben ;)
        a.closeWindow; 
    }
    //windows.hpp
    template<> class baseEngine<windows>{
         DXWrapper wrapper;
         //usw
    };
    //linux.hpp
    template<> class baseEngine<linux>{
         OpenGLWrapper wrapper;
         //usw
    };
    

    ein parameter geändert, und damit gleich eine andre grundlage für die engine, eine andre art, das fenster zu öffnen und auch ein andres archivsystem. Und das alles ganz ohne defines


Anmelden zum Antworten