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