VC08: makro-funktion per /D



  • hallo

    ich möchte ein Funktions-makro per Kommandozeile definieren. Dazu füge ich z.B. einfach '/D "dub(BLA)="' der Kommandozeile hinzu. Leider funzt das nicht.

    dub(1)
    
    int main() //error C2448: 'dub' : function-style initializer appears to be a function definition
    {
    }
    

    Was ist falsch?



  • Hä?



  • Makros werden immer noch mit #define definiert.



  • Ja, oder auf Kommandozeile...

    cl /D "_UNICODE"
    


  • Also wenn du dein Makro per Kommandozeilenparameter genauso definieren musst, wie im Quellcode (und davon gehe ich mal ganz stark aus), dann ist doch klar, wieso das vorn und hinten nicht funktioniert. Gleichheitszeichen?? Und "dub(1)" einfach so im Code ohne Semikolon?? Hast du schonmal ein Makro definiert?



  • _matze schrieb:

    Also wenn du dein Makro per Kommandozeilenparameter genauso definieren musst, wie im Quellcode (und davon gehe ich mal ganz stark aus), dann ist doch klar, wieso das vorn und hinten nicht funktioniert. Gleichheitszeichen?? Und "dub(1)" einfach so im Code ohne Semikolon?? Hast du schonmal ein Makro definiert?

    Ich sehe nicht, wo ein Semikolon nötig ist.

    #define DUB(BLUB)
    DUB(1)
    
    int main()
    {
    }
    

    Nun möchte ich dieses DUB-Funktionsmakro per Kommandozeile definieren. Das Gleichheitszeichen ist da nötig, ansonsten würde VC implizit '#define DUB(BLUB) 1' annehmen. Siehe http://msdn.microsoft.com/en-us/library/hhzbb5c8.aspx.

    Danke!



  • heldenhafterHeld schrieb:

    Ich sehe nicht, wo ein Semikolon nötig ist.

    #define DUB(BLUB)
    DUB(1)
    
    int main()
    {
    }
    

    Ich sehe nicht, wo der Sinn dahinter stecken soll. Du willst ein Makro definieren, dass einen Parameter entgegen nimmt, dass aber auf nix definiert ist?? Ist das wirklich deine Absicht? Der Parameter total unnötig (genau wie die Anwendung mitten im Code ohne weitere Abfrage per #ifdef oder so), wenn das Makro nichts machen soll. Ebenso ist es die gezeigte Verwendung. Eine Verwendung in Ausdrücken ist auch nicht möglich (bzw. komplett ohne Effekt). Am besten, du zeigst mal den richtigen Code. Das hier ist doch hoffentlich nur ein vereinfachtes Beispiel...?



  • Das Makro ist Teil meines Buildsystemes. Mein eigener Präprozessor parst im Vorfeld die Eingabedatei und fügt, falls das Makro expandiert wird, das Argument zu den Link-Dependencies hinzu.
    Konkret geht es um folgenden Code:

    BASE_LINK_LIB("kernel32.lib")

    Mein Präprozessor erkennt das Makro (wird implizit definiert, quasi ein sysmakro wie __cplusplus) und fügt "kernel32.lib" zu den Linkerargumenten hinzu. Der Compiler selbst soll aber dieses Makro ignorieren. Demnach möchte ich dann einfach ein leeres Makro namens "BASE_LINK_LIB" mit einem Argument per Kommandozeile definieren. Ja, ich weiß, es gibt #pragma lib und den ganzen Spaß. Macht aber in meinen Fall wenig sinn, da ich so Compilerunabhängig wie möglich sein möchte.



  • Ich bumpe zwar nicht gerne, aber weiß wirklich keiner Rat?



  • Was willst Du denn noch wissen?
    Reicht ein

    cl /D "DUB(BLUB)"
    

    nicht aus?



  • Wie eingangs erwähnt, funktioniert das eben nicht. Weder '/D "dub(BLA)="' noch '/D "dub(BLA)"' . Ich kriege diesen komischen CL Fehler.



  • Hat er dann nicht weitrhin das Problem, dass implizit auf 1 definiert wird?

    EDIT: Was ist, wenn du es so notierst?

    #define DUB(BLUB) ;
    

    Ein Semikolon stört nicht mitten im Code. Sollte klappen, oder?



  • _matze schrieb:

    Hat er dann nicht weitrhin das Problem, dass implizit auf 1 definiert wird?

    EDIT: Was ist, wenn du es so notierst?

    #define DUB(BLUB) ;
    

    Ein Semikolon stört nicht mitten im Code. Sollte klappen, oder?

    Per Kommandozeile (also '/D "DUB(BLUB) ;"') geht auch nicht. Ich denke, er kann generell keine Funktionsmakros definieren.
    Im moment nehme ich eine forced include file, welche das Makro enthält, als workaround. Das ist leider nur sehr unschön



  • Ich möchte ja nicht den Klugscheisser spielen ( ich weiss, is zu spät 😃 ) aber ich finde BUILD-Kommandos innerhalb des Source-Codes... mhh, unlegant.
    Warum ist das so designed? Wenn du sowas schon baust, warum nimmst du nicht ein Makefile als Eingabe für die BUILD-Kommandos?
    Ich hoffe die Frage ist mal am Rande gestattet...
    rya.



  • Scorcher24 schrieb:

    Ich möchte ja nicht den Klugscheisser spielen ( ich weiss, is zu spät 😃 ) aber ich finde BUILD-Kommandos innerhalb des Source-Codes... mhh, unlegant.
    Warum ist das so designed? Wenn du sowas schon baust, warum nimmst du nicht ein Makefile als Eingabe für die BUILD-Kommandos?
    Ich hoffe die Frage ist mal am Rande gestattet...
    rya.

    Weil ich komplett auf build-files verzichte (deshalb baue ich mir auch mein eigenens, automatisiertes Build-system) und kein auto-linking eh' bei vielen einzel Bibliotheken (z.B. boost) auf dauer einfach nur nervig ist.


Anmelden zum Antworten