È una buona pratica (credo) in C per gestire errori come questo:
int status = tree_climb(tree, ...);
if (status != 0) {
global_logger.message(2, "Cannot climb a tree %s", tree->name);
return EPIPE;
}
o, in alternativa
forest_errno = tree_climb(tree, ...);
if (forest_errno != 0) {
goto exit;
}
exit:
if (tree) {
tree_dispose(tree);
}
if (forest) {
forest_dispose(forest);
}
return forest_errno;
Le domande sono:
Quali sono i motivi per non utilizzare una macro per il preprocessore per questo? Non ricordo di aver visto un sacco di codice come:
#define CHECK_OR_RETURN(contract, error_status, log_level, message_format, ...) \
if (!(contract)) { \
global_logger.message(log_level, message_format, ##__VA_ARGS__); \
return error_status; \
}
Vedo questi motivi per utilizzare una macro:
- Questo comprime 4 righe di codice, 3 delle quali non fanno nulla durante il normale flusso di operazioni, in 1.
- La gestione degli errori, idealmente, non dovrebbe inquinare il codice per un flusso normale.
Vedo questi motivi per non utilizzare una macro:
-
La macro
- ottenerà la lettura e il debug del codice in qualche modo. La sintassi "magica" auto-inventata può trasformare un linguaggio familiare in un incomprensibile: a volte, non è possibile analizzare un codice senza conoscere le specifiche di una libreria. Sebbene, su larga scala, un codice 3 volte più breve sia 9 volte più leggibile.
- In C ++, potremmo usare le eccezioni. Preferirei non utilizzare eccezioni non controllate, ma non rientrano nell'ambito della mia domanda.
- Alcune persone semplicemente non si preoccupano della lunghezza del codice.
Quindi perché la gente non lo fa sempre?