#define mit ... oder // ?



  • _ProfEich schrieb:

    #ifdef DEBUGMODE
    #  define Log(a, ...) Comment(a, ...)
    #else
    #  define Log(a, ...)
    #endif
    

    was klappt daran nicht?



  • thx schonmal.

    Wenn ich das überall in den Code schreiben wollte, würd das nachher stark an übersichtlichkeit verlieren, denke ich mal.

    und wenn ich dass mit dem Log(a, ...) versuche kommen nur massig Fehlermeldungen:

    d:\_yanita\game\yanapp.h(68) error C2010: '.' : unexpected in macro formal parameter list
    d:\_yanita\game\yanapp.h(68) error C2010: '.' : unexpected in macro formal parameter list
    d:\_yanita\game\yanapp.h(68) error C2010: '.' : unexpected in macro formal parameter list
    d:\_yanita\game\yanapp.h(68) error C2010: ')' : unexpected in macro formal parameter list



  • #ifdef DEBUGMODE
    #define Log(A) Comment(A)
    #else
    #define Log(A) ((void)0)
    #endif
    
    int main() {
      Log("%d",15);
    }
    

    HTH



  • oh, du hast einen compiler, der nicht ... in makroparameterlisten erlaubt. naja, sowas soll's ja geben. ... ist ja auch non-standard.

    dann könnte was bitteres gehen:

    #ifdef DEBUGMODE
    #  define Log Comment
    #else
    #  define Log NoComment
    #endif
    

    und du baust noch ne leere inlinefunktion namens NoComment.

    udn beim makro-aufruf gabs noch was, wenn ich mich recht erinnere.
    bei

    Log (1,2,3)
    

    macht er

    Comment (1,2,3)
    

    draus und es geht.
    aber bei

    Log(1,2,3)
    

    sagt er dir, daß das makro Log gar nicht drei paramater essen mag.

    ist aber jetzt alles nur ganz verschwommenes wissen, das ich jahrelang nicht mehr angewndt habe. kann total falsch sein oder nur auf nem bestimmten compiler so sein.



  • Dieser Code funktioniert bei mir einwandfrei:

    #include <iostream> 
    
    #define DEBUGMODE
    
    #define Comment(a) std::cout << a << std::endl;
    
    #ifdef DEBUGMODE 
    #  define Log(a) Comment(a) 
    #else 
    #  define Log(a) 
    #endif
    
    int main () { 
       Log(4)
       Log(33);
    
       return 0;
    }
    


  • @interpreter

    Aber ohne den ... kann ich sowas wie:

    Log( "FPS: %i - Vertices: %i", fps, vertcnt );
    Log( "Device: %s", gfxDevice );
    

    nicht machen.

    @volkard
    Als Compiler benutzt ich immo den von VC++ 6.0.

    Und da es sich später um ein Spiel handeln soll:
    Würde eine leere inline Funktion nicht auch schon minimal an Geschwindigkeit abnehmen?

    Ich meine, in der Release-Version wird der Debug Kram zwar raus kommen, aber nur mal aus Neugier?

    Ich werds dann allerdings vorerst so lösen, thx : )



  • inline void Log(const char*, ...)
    {
        #ifdef DEBUGMODE
    
        // ...
    
        #endif
    }
    

    So hast ein grässliches Makro weniger 😉



  • Nein, eine leere inline-Funktion ergibt bei heutigen Compilern keinen einzigen Maschinenbefehl; du hast also keinen Nachteil.



  • ...



  • @volkard
    Das mit dem " " spielt nur eine Rolle im define. Man beachte:

    #define foo(a,b)
    

    ist nicht das selbe wie:

    #define foo (a,b)
    

    Jedoch ist das:

    void foo(int a,int b);
    

    gleich das:

    void foo (int a,int b);
    

    Und deshalb findet man in jedem guten Buch einen Hinweis darauf.



  • _ProfEich schrieb:

    @interpreter

    Aber ohne den ... kann ich sowas wie:

    Log( "FPS: %i - Vertices: %i", fps, vertcnt );
    Log( "Device: %s", gfxDevice );
    

    man könnte

    inline void ignore(...) {}
    #ifdef _DEBUG
    #define Log Comment
    #else
    #define Log ignore
    #endif
    Log("asdasd", 234, 2134, 345);
    

    schreiben, man darf die Funktion halt nur nicht mit nicht-POD-Typen aufrufen.
    Oder auch möglich:

    #ifdef _DEBUG
    #define Log(A) Comment A
    #else
    #define Log(A) (void)0
    #endif
    Log(("lala", 1, 2, 3, 4, 5));
    

    Oder für noch miesere Präprozessor-Spielereien siehe: http://www.cuj.com/documents/s=8464/cujcexp0308alexandr/
    Damit wäre es dann

    Log(123)(bla)(lala);
    

Anmelden zum Antworten