KLEINZACH: My mame ve firme takovej zvlastni coding style zhruba tohohle typu:
int funkce(...)
{
int err;
bar_t *bar = NULL;
err = foo(...);
bail_error(err); /* if (err != 0) { log; goto bail; } */
err = bar_create(&bar, ...);
bail_error_null(err, bar); /* if (err != 0 || bar == NULL) { log; goto bail; } */
bail:
bar_destroy(&bar); /* if (bar != NULL) { Nejaky destruktor }; bar = NULL; */
return err;
}
Zezacatku me to dost stvalo (prisel jsem z C++, a absence automaticky vyvolavanych destruktoru me dost silne iritovala), ale celkem rychle jsem si zvykl, a jiste vyhody v tom vidim. Je to pravidelny, prehledny pro code review, celkem snadno je videt chybejici volani destruktoru. Jeden return z toho pak tak nejak vyplyva, a fakt je ten, ze to code review dost usnadnuje.
Nutno rict, ze duvody, proc se ten system pise v C, jsou prevazne historicke, na vykon nebo pametovy footprint se moc nejede. (Jedna se o programovani routeru, ten hlavni vykon odvadi custom ASIC, a v C se pise to integracni lepidlo mezi command line, protocol stackem, webovym rozhranim, perzistenci, a zejmena SDK, ktery resi ten offloading samotny).