Wpis z mikrobloga

Dziś w #starebugi ciekawostka z 2010 roku:
Dziwny sposób pisania kodu w libev, który generuje ostrzeżenia i muszę się pół godziny zastanawiać czemu.

Krótki opis: http://lists.schmorp.de/pipermail/libev/2010q1/000917.html

Czemu tak?

/* these may evaluate ev multiple times, and the other arguments at most once */

/* either use evinit + evTYPEset, or the evTYPE_init macro, below, to first initialise a watcher */

#define evinit(ev,cb) do { \

((ev_watcher *)(void *)(ev))->active = \

((ev_watcher *)(void *)(ev))->pending = 0; \

evsetpriority ((ev), 0); \

evsetcb ((ev), cb); \

} while (0)


#define evioset(ev,fd,events) do { (ev)->fd = (fd); (ev)->events = (events) | EVIOFDSET; } while (0)

#define evioinit(ev,cb,fd,events) do { evinit ((ev), (cb)); evioset ((ev),(fd),(events)); } while (0)


Użyte zostały makra zamiast funkcji i widocznie rzutowanie (lub jego brak) w niektórych miejscach nie podoba się GCC.

##!$%@?