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.