C makro - konstrukce do{...}while(0)
Miroslav Draxal
evik na volny.cz
Pondělí Prosinec 4 12:36:05 CET 2017
Aha, dobrá informace, také jsem se párkrát zastavil nad do {...} while(0).
Míra
-----Original Message-----
From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Jaroslav Buchta
Sent: Monday, December 04, 2017 10:35 AM
To: hw-list na list.hw.cz
Subject: Re: C makro - konstrukce do{...}while(0)
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
_______________________________________________
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