enum vs typedef enum

Tomáš Hamouz konfery.tomas.hamouz na seznam.cz
Úterý Září 19 12:55:11 CEST 2023


Když už se trumfujeme v bizarních konstrukcích :-)

pro všechny C překladače funguje

  #define SIZE_CHECK(name, size)  static char* _##name##_size = !(sizeof(name)==size);

A v novějších včetně C++ zcela nudné

  #define SIZE_CHECK(name, size)  static_assert(sizeof(name)==size, "Velikost " TOSTRING(name) " nesouhlasi");

Někde se místo static_assert musí psát _Static_assert, funguje stejně.

Tomáš


> Jen pro zajimavost, kontrola velikosti se da udelat uz behem prekladu, i
> kdyz dost krkolome.
> Nasel jsem tuto konstrukci, kteroch chapu jen trosku resp. musim vzdycky
> trosku vic premyslet, ale funguje ;-)

>      #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 
> 2*!!(condition)]))
>      BUILD_BUG_ON( sizeof(app_data_cfg_t) != CFG_DATA_LEN );



> Dne 19.09.2023 v 12:08 Tomáš Hamouz napsal(a):
>> Pokud je enum součástí struktury, které je sdílená mimo vlastní systém
>> (typicky přenášena přes sériovou linku), používám buď omezení
>> velikosti přes bitfield (ale není to pak podle MISRA), a vždy za
>> definicí struktury assert na její velikost. A v rámci struktury dělám
>> "ruční" poskládání položek ve vhodném pořadí, aby se negenerovaly
>> díry, a na konci, pokud je třeba, závěrečnou položku na zarovnání
>> celé struktury.
>> Není to ideální, ale běžné nekompatibility v nastavení kompílátoru to
>> odchytí.
>>
>> Tomáš
>>
>>
>>
>>> Presne z dovodu, ze to ma "neurcitu" sirku, pouzivam enum viacmenej len ako
>>> "generator konstant"; a potom je to jedno, ci s typedef ci bez.
>>> Ano, pri ladeni mi chyba, ze gdb potom vypisuje len cislo. Vsetko ma svoje
>>> pre a proti. Mozno to svoje rozhodnutie raz prehodnotim.
>>> wek
>>
>>> ----- Original Message ---------------
>>>> Njn, ale to muze omezit prenositelnost kodu, napr. diky ruznemu
>>>> zarovnani a velikosti struktur...
>>>> V tom C++ to vypada fajn, ale to zase na MCU nepouzivam.
>>>>
>>>> Dne 19.09.2023 v 11:40 Tomáš Hamouz napsal(a):
>>>>> Re: enum vs typedef enum To je věc nastavení kompilátoru. Lze si
>>>>> vybrat mezi 32bit a minimální nutnou šířkou.
>>>>> v GCC -fshort-enums
>>>>>
>>>>> Tomáš
>>>>>
>>>>>
>>>>>       Tak ono ani C neprovadi tusim pri prekladu kontrolu typu, takze je to
>>>>> spis pro lepsi orientaci. Spis me na tom stve, ze to udela 32b
>>>>> promennou tam, kde by stacilo 8.
>>> _______________________________________________
>>> 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