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

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Pondělí Prosinec 4 10:35:05 CET 2017


Diky za nazorne vysvetleni, takhle to uz dava smysl.

Dne 04.12.2017 v 10:30 Josef Štengl napsal(a):
> 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
> _______________________________________________
> 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