C makro - konstrukce do{...}while(0)

Josef Štengl ok1ced na nagano.cz
Pondělí Prosinec 4 10:30:53 CET 2017


Tady je to trošku více rozepsané proč (protože středník :-). Je to dost častá chyba, vlastně veškerý kód v makru, který 
obsahuje středník by měl být pro jistotu dán do do ... while(0) nebo lépe do (inline) funkce, on si s tím pak kompilátor 
poradí :-).

Pokud má makro obsahovat více výrazů (například volání funkcí) tak je vhodné je umístit do do-while-zero výrazu (do { …; 
…;} while (0))

Příklad:  Tři způsoby zápisu stejného kódu v makru:
#define VYRAZ_A		expr1(); expr2(); expr3();
#define VYRAZ_B		{ expr1(); expr2(); expr3(); }
#define VYRAZ_C		do { expr1(); expr2(); expr3();} while(0)

Jejich použití v následujících situacích (při použití je x nahrazeno A, B nebo C):
1)
  VYRAZ_x;
2)
if (cond)
   VYRAX_x;
else
  ...

Výrazy se všechny varianty  v případě 1) vykonají všechny shodně.

Ale v případě 2)
a)
jsou vykonány expr2() a expr3() vždy bez závislosti na podmínce (v tomto konkrétním případě se kód nepřeloží kvůli else).

b)
skončí kompilační chybou (protože ; přeruší tok programu mezi if a else)

c)
bude se vykonávat tak jak očekáváme.


Dne 3.12.2017 v 20:25 Jaroslav Buchta napsal(a):
> Casto se setkavam napr. s takovouto konstrukci makra
> 
> #define __RETURN(GSM, val)                      do { (GSM)->RetVal = (val); return (val); } while (0)
> 
> Proc se to uzavira do cyklu do...while s jednou iteraci a ne jen do bloku?
> 
> 
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list