[elektro] C-s IDE kérdés
Lajos Rancz
lajos.rancz at gmail.com
Thu Mar 29 10:28:24 CEST 2012
Helló!
Belejegyzetelek a leveledbe!
2012. március 29. 10:18 hg12345 írta, <hg12345 at freemail.hu>:
> Szia,
> köszönöm a segítséget,
> de nem értem :-( !!!!
>
> #define ASSERT_CONCAT_(a, b) a##b
> #define ASSERT_CONCAT(a, b) ASSERT_CONCAT_(a, b)
> #define ct_assert(e) enum { ASSERT_CONCAT(assert_line_, __LINE__) =
> 1/(!!(e)) }
>
> Az első két sor még megy, ugyan a duplázás miért fontos számomra homály.
>
A duplázás azért fontos, hogy az eredmény mindenképpen 0/1 legyen ha a
bejövő érték nem is ilyen volt.
> A harmadik sor létrehoz egy assert_line_XXXX alaku enumot, aminek ez
> érteke 1 lenne, de az
> !!(e) szerint változik, ha e=0 (FALSE) akkor nem tudom mit csinál mert
> nullával nem osztunk, minden más esetben 1.
>
Épp ez a lényeg! Mert a 0-val való osztás kiderül futási időben => nem
fordul a kód!
Tehát pl:
ct_assert(sizeof(int) == 4) // ez nem fog fordulni ha int nagysága 16 vagy
64 bit.
Ez az egész arra való, hogy fordítási idejű limiteket tegyél a programba.
Pl a te esetedben
ct_assert(myenum_last * sizeof(record) < 8192); // record-okat tartunk egy
8192 bajt nagysagu EEPROM-ban, myenum_last az utolso elem az enumok kozt
Üdv
More information about the Elektro
mailing list