[linux-l] do{ . } while (0) (was: Arrays in C)
Axel Weiß
aweiss at informatik.hu-berlin.de
Mi Nov 23 20:55:18 CET 2005
Frank Reker schrieb:
> Am Tue 22. Nov 2005 23:31 +0000 schrieb Axel Weiß:
> >Frank Reker schrieb:
> >> es reicht hier aus in der makrodefinition die anweisungen in {} zu
> >> setzen.
> >
> >Und was macht ein C-Compiler mit
> >
> > {};
>
> das ist eine leere anweisung. im normalfall wird sie ignoriert.
> hinter einem else bezeichnet es einen leeren block: also:
> if (cond1) if (cond2) anw1; else {}; else anw2;
> auf diese weise bezieht sich anw2 auf das erste if. aber in dem
> fall waere ein klammern des inneren if eine elegantere loesung:
> if (cond1) {if (cond2) anw1;} else anw2;
>
> aber wofuer brauchst du das?
Hi Frank, hi Oliver,
ist das so schwer zu verstehen? Ich mach mal ein Beispiel:
#define MAKRO1(x) {anw1(x); anw2();}
#define MAKRO2(x) do {anw1(x); anw2();} while (0)
Mit der do-while-Konstruktion kann ich folgendes machen:
if (cond1) MAKRO2(k);
else {...}
MAKRO2 expandiert zu genau einer Anweisung (statement), die keine
{}-Klammern benötigt. Kein Problem hier.
Mit dem ersten Makro geht das aber nicht:
if (cond1) MAKRO1(k);
else {...}
expandiert nämlich zu
if (cond1) {anw1(k); anw2();};
else {...}
und bei else kommt syntax error.
Axel
Mehr Informationen über die Mailingliste linux-l