c-kod
Tomáš Hamouz
hamouz na divesoft.cz
Pátek Únor 10 08:59:14 CET 2017
To je záplata na preprocesor.
Musíte si uvědomit, jak preprocesor funguje. Prochází text a když
narazí na makro, příslušným způsobem ho nahradí. To opakuje tak
dlouho, dokud je co nahrazovat. Přitom se nahrazuje v pořadí od
začátku do konce (wek by jistě dodal odkaz do normy).
Jak bude vypadat text při preprocesingu:
Původní text
ct_assert(sizeof(mcfg) < CONFIG_SIZE);
Po 1. průchodu
enum { ASSERT_CONCAT(assert_line_, __LINE__) = 1/(!!(sizeof(mcfg) < (FLASH_PAGE_SIZE * 2)
Po 2. průchodu
enum { ASSERT_CONCAT_(assert_line_, 25) = 1/(!!(sizeof(mcfg) < (((uint16_t)0x400) * 2))) };
Po 3. průchodu
enum {assert_line_25 = 1/(!!(sizeof(mcfg) < (((uint16_t)0x400) * 2))) };
Při kompilaci se vyhodnotí poslední výraz a pokud podmínka nebude
splněna, překladač vám vynadá že dělíte nulou.
Pokud by ASSERT_CONCAT bylo definované jednodušeji, po 2. průchodu by
vznikla řádka
enum {assert_line___LINE__ = 1/(!!(sizeof(mcfg) < (((uint16_t)0x400) * 2))) };
Což pravděpodobně nebylo záměrem.
Tomáš
> Dobrý den,
> pro inspiraci a poučení se snažím projít program (BaseFlight)
> a není mi jasné, co dělá tato část.
> #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)) }
> #define FLASH_PAGE_SIZE ((uint16_t)0x400)
> #define CONFIG_SIZE (FLASH_PAGE_SIZE * 2)
> void initEEPROM(void)
> {
> ct_assert(sizeof(mcfg) < CONFIG_SIZE); //! make sure (at
> compile time) that config struct doesn't overflow allocated flash pages
> }
> Jde hlavně o první 3 řádky.
> Díky za vysvětlení.
> HUDA
> _______________________________________________
> 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