Seltsames Macro in GMP



  • Hallo,
    ich habe gerade einen Header der GMP library angeschaut und folgendes macro gefunden:

    #define MPN_FILL(ptr, size, n)          \
      do {                                  \
        mp_size_t __i;                      \
        ASSERT ((size) >= 0);               \
        for (__i = 0; __i < (size); __i++)  \
          (ptr)[__i] = (n);                 \
      } while (0)
    

    Warum wird hier eine do while schleife verwendet, die immer einmal ausgeführt wird. Würde das hier nicht da selbe bewirken?

    define MPN_FILL(ptr, size, n)            \
      { /*neuer gültigkeitsbereich*/          \
          mp_size_t __i;                      \
          ASSERT ((size) >= 0);               \
          for (__i = 0; __i < (size); __i++)  \
            (ptr)[__i] = (n);                 \
      }
    


  • Vielleic´ht geht es ums Semikolon am ENde.

    if(bla())
    MPN_FILL(...);<--!!
    else

    (Gar nicht durchdacht, aber dazu bist Du ja da, war nur so einme Idee.)



  • Es geht ums Semikolon, vor allem bei if abfragen ohne geschweifte Klammern. (Wie volkard schon gesagt hat)

    Hier noch ein erklaerendes Beispiel (aus der Wikipedia)

    // Variante 1
    #define CMDS \
      do { \
        a = b; \
        c = d; \
      } while (0)
    
    // Variante 2
    #define CMDS \
      { \
        a = b; \
        c = d; \
      }
    

    Das Beispiel, welches mit Variante 2 nicht funktioniert:

    if (var == 13)
        CMDS;
      else
        return;
    
    // Variante 1 wird zu
    // (Keine Probleme)
    if (var == 13)
        do {
          a = b;
          c = d;
        } while (0);
      else
        return;
    
    // Variante 2 wird zu
    if (var == 13) {
          a = b;
          c = d;
      }
      ;  
      else // Syntax error wegen dem zusaetzlichen ; (empty statement)
        return;
    

    Hier der Artikel: http://en.wikipedia.org/wiki/C_preprocessor, das steht das alles.


Anmelden zum Antworten