#define check(podminka) if(!(podminka)) return
Tak ty jses dobry cune. Pouzivani maker je problematicke samo o sobe. Neda se to poradne debugovat. Atd. Takovehle makra mas v produkcnim kodu?
Makra taky nepreferuju, ale mají několik výhod, který se prostě nedají ignorovat.
Třeba to, že kdybych tohle zapouzdřil jako funkci, tak se nemůžu vrátit z funkce o level výš.
Nebo je to nejjednodušší způsob, jak udělat polymorfní funkci - místo add(a, b) pro int a pod jiným jménem pro float je tam makro, kde nezáleží na typech.
Anebo prostě fakt, že ošetření návratu přes setjmp() na embedded věcech sežere dost RAMky a třeba ve FreeRTOSu havaruje celá aplikace...
Pak taky není špatný zabalit funkci, které předáváš pointer na buffer a velikost bufferu společně se sizeof(), to taky ušetří hodně práce. Prostě
uint8_t buffer_8b[];
uint16_t buffer_16b[];
uint32_t buffer_32b[];
intptr_t buffer_ptr[];
fillZero(buffer_8b);
fillZero(buffer_16b);
fillZero(buffer_32b[]);
fillZero(buffer_ptr[]);
kde je makro
#define fillZero(buff) _fillZero(buff, sizeof(buff) / sizeof(buff[1]))
je přehlednější, než tam ručně cpát vnitřek té definice, nebo jako velikost rvát magický konstanty apod.
Jedno ze základních pravidel je, že je lepší jednu věc mít na jednom místě v kódu, i za cenu makra nebo (inline) funkce.
A co se debugování maker týká, pokud je zřejmý, co makro dělá (= odladěný a schovaný 1 LOC), nebo jenom zpouzdřuje funkci (do které skočíš a vidíš parametry), není to problém.