Warum ein do-while(0) Block in Makros verwenden



  • Hallo,

    warum sollte man laut Empfehlung in linux/Documentation/CodingStyle ein do-while(0) Block in mehrzeiligen Makros verwenden, z.B.:

    #define do_this(a, b) \
      do { \
        a = b; \
        b = 0; \
        ... \
      } while(0)
    

    Ist das nur, damit der Code einheitlich wirkt oder steckt da ein gewisser Sinn dahinter?



  • Ja, es steckt ein Sinn dahinter - durch das do-while wird das Makro zu einer einzigen Anweisung und kann genauso wie ein Funktionsaufruf verwendet werden.

    //primitivste Version:
    #define do_this(a,b) \
      a=b; \
      b=0; \
      ...
    
    do_this(v1,v2);//klappt fehlerfrei
    
    if(input=='y')
      do_this(v1,v2);
    /*
    wird zu:
        if(input=='y')
          v1=v2;
        v2=0;
        ...
    Die Einrückungen sind für den Compiler egal - er hängt die erste Anweisung an das if() - und das ist nicht das komplette Makro, sondern nur das 'a=b;'
    */
    


  • blöd sind nur immer diese warnings: 'condition always false' 😉
    :xmas2:



  • So eine Warnung (die man im Ernstfall auch abschalten/ignorieren kann) ist mir auf jeden Fall lieber als ein Programm, das nicht macht was es soll 😉

    (eine bessere Lösung wäre es sowieso, anstelle des Makros eine Inline-Funktion zu verwenden - deren Aufruf IST eine einzelne Anweisung und muß auch nicht mit irgendwelchen do-while-Konstrukten eingeklammert werden)



  • Und was würde dagegen sprechen, Blockzeichen { und } zu verwenden, z.B. so:

    #define do_this(a, b) \
        { \
            a = b; \
            b = 0; \
           ... \
        }
    



Anmelden zum Antworten