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