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