Makro für namespace-Erzeugung schreiben



  • Ich habe ein Projekt, bei dem ich mehrere Instanzen einer Anwendung gleichzeitig laufen lassen möchte. Um den Code nicht mehrmals hinschreiben zu müssen und Namenskonflikte zu vermeiden, habe ich mir gedacht, Namespaces zu verwenden. Das soll so aussehen:

    namespace n1 {
       #include "datei.ct"
    }
    
    namespace n2 {
       #include "datei.ct"
    }
    

    Das Ganze möchte ich nun abkürzen, sodass man nur den Namen des Namespaces und die zu inkludierende Datei angeben muss. Ich habe also ein Makro geschrieben:

    #define namesp(inkl, name) namespace name { inkl }
    

    inkl enthält hierbei schon die komplette Direktive #include "datei.ct".
    Das Problem hierbei ist, dass ein #include in einer neuen Zeile stehen muss, in einem Makro kriege ich das aber nicht hin. Auch die Klammer zu am Ende (}) muss in einer neuen Zeile stehen.

    Geht so etwas überhaupt mit einem Makro oder geht das schöner mit Templates o.ä.?

    Danke für eure Antworten!



  • fep2k schrieb:

    Das Problem hierbei ist, dass ein #include in einer neuen Zeile stehen muss, in einem Makro kriege ich das aber nicht hin...

    Umbruch in einem Makro geht mit "\"

    #define GANZBOESESMAKRO \
      foo();
    

    fep2k schrieb:

    Geht so etwas überhaupt mit einem Makro oder geht das schöner mit Templates o.ä.?

    Templates können keine Includes generieren (Include gehört zu wie alle Direkttiven die mit # beginnen zum Präprocessor, Templates werden erst in einem späteren Schritt aufgelöst).

    cu André



  • Ok, der Backslash ermöglicht es mir, nach einem Zeilenumbruch das Makro in der nächsten Zeile fortzusetzen.
    Wenn das Makro aber expandiert wird, gehen die Zeilenumbrüche verloren.
    Der "\" dient nur dazu, das Makro übersichtlicher zu machen oder sehe ich das falsch?
    Was ich brauche, ist ein "tatsächlicher" Zeilenumbruch in dem Code, den mein Makro erzeugt.



  • fep2k schrieb:

    Ok, der Backslash ermöglicht es mir, nach einem Zeilenumbruch das Makro in der nächsten Zeile fortzusetzen.
    Wenn das Makro aber expandiert wird, gehen die Zeilenumbrüche verloren.

    Da Makros aber nicht der Generierung von Code zur Weitervorlage dienen ist dies völlig egal.

    fep2k schrieb:

    Der "\" dient nur dazu, das Makro übersichtlicher zu machen oder sehe ich das falsch?
    Was ich brauche, ist ein "tatsächlicher" Zeilenumbruch in dem Code, den mein Makro erzeugt.

    Darf ich fragen: Wozu?

    Der Normale Ablauf ist das Code compiliert, und nicht auf Zwischenschritte des Präprozessors/Compilers/Linkers zurückgegriffen wird.

    cu André



  • Ich will meine Namespaces folgendermaßen defnieren:

    namespace n1 {
       #include "datei.ct"
    }
    
    namespace n2 {  
       #include "datei.ct"
    }
    

    Wenn ich diese Abschnitte in eine Zeile schreibe, also:

    namespace n1 {#include "datei.ct" }
    

    bekomme ich die Fehlermeldung: "stray '#' in program".
    Das #include muss in einer eigenen Zeile stehen und es dürfen nach dem #include keine weiteren Zeichen stehen.

    Das Ganze brauche ich für meine Studienarbeit, mein Betreuer möchte, dass man die Namespaces schön mit einer Zeile definieren kann.
    Aber so schön geht das wohl nicht, oder?

    Danke für die Antworten!



  • Ich würde die Inkludes Ausserhalb des namespaces machen.
    Dafür die Typen (im Headerfile) schon in den korrekten namespace rücken.



  • Wenn du mehrere Instanzen von irgendwas haben willst dann leg doch einfach mehrere Instanzen an.
    Solange du überall dort auf globale/statische Variablen verzichtest wo es "böse" ist, und auch sonst einigermassen "sauber" programmierst kann dabei eigentlich nix daneben gehen. Ich sehe auf jeden Fall keinen Grund den Code zu duplizieren, mit oder ohne includes, mit oder ohne Namespaces.


Anmelden zum Antworten