[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