[so] Macro DIE

Laura Vasilescu vasilescu.laura at gmail.com
Fri Feb 24 13:12:54 EET 2012


2012/2/24 Cristian Condurache <cristian.condurache at gmail.com>:
> M-am uitat peste definitia macro-ului DIE de pe wiki [1] si nu inteleg care
> este rolul while(0)-ului exterior. Imi poate spune cineva?
>
> Cristian Condurache
>
> [1] http://elf.cs.pub.ro/so/wiki/laboratoare/resurse/die

Salut!

Să luăm un exemplu mai simplu:
#define MACRO(x)
                         x++; \
                         printf("%d\n", x)


Substituția se face textual. Dacă ai folosi undeva:
if (conditie) MACRO(x);
printf-ul se execută indiferent de valoarea condiției; acesta este
motivul pentru care setul de instrucțiuni trebuie să apară într-un
bloc.

Redefinim așa:
#define MACRO(x) {  \
                         x++; \
                         printf("%d\n", x); \
                         }

În momentul în care folosim MACRO(x) nu o să putem să punem ";" la
final, pentru că nu are sens.

Soluția de a folosi do-while este un trick pentru a rezolva această
problemă. (nici macro-ul DIE nu are ";" după while tocmai pentru a
lăsa utilizatorul să pună ";"). Se folosește while(0) pentru a nu se
executa setul de instrucțiuni decât o singură dată.

-- 
Laura


More information about the so mailing list