Eventuali duplicati:
Do-While and if-else statements in C/C++ macrosfunzione come macro parentesi graffe o do..while
gcc (GCC) 4.7.2
c89
Ciao,
ho la seguente funzione simil-macro e basta chiedendosi qual è l'utilizzo preferito quando si utilizza su più linee. È meglio usare le parentesi graffe o il ciclo do..while (0).
Normalmente utilizzo un do..while (0) per tutto. Ma ho visto alcuni progetti in cui usano solo le parentesi graffe e non sono sicuro di quale sia la migliore.
do..while
#define DSO_ERROR(msg, res_handle_module, mem_pool, size) do { \
char *dso_error = apr_palloc((apr_pool_t*)mem_pool, size); \
apr_dso_error((apr_dso_handle_t*)res_handle_module, (char*)dso_error, (apr_size_t)size); \
LOG_ERR("%s dso error %s", (char*)msg, dso_error); \
goto dso_failure; \
} while(0);
graffe
#define DSO_ERROR(msg, res_handle_module, mem_pool, size) { \
char *dso_error = apr_palloc((apr_pool_t*)mem_pool, size); \
apr_dso_error((apr_dso_handle_t*)res_handle_module, (char*)dso_error, (apr_size_t)size); \
LOG_ERR("%s dso error %s", (char*)msg, dso_error); \
goto dso_failure; \
}
L'unica differenza è che un semi-colon sarà preimpostato sul ciclo do..while e non sulle parentesi graffe.
Molte grazie per qualsiasi suggerimento,
Mio Dio, questo è un brutto codice. (senza offesa intesa, sono solo molto sorpreso). – rubenvb
L'aggiunta del punto e virgola alla fine di 'do {...} while (0)' impedisce lo scopo di usare 'do {...} while (0)' in primo luogo. Lo svantaggio della versione solo per bretelle è che non puoi scrivere 'if (qualcosa) DSO_ERROR (...); else {...} 'perché il punto e virgola è un'istruzione null dopo' if' e 'else' è un errore di sintassi. Con la versione corretta di 'do {...} while (0)', la notazione 'if' /' else' funziona come ci si aspetterebbe se la macro fosse effettivamente una funzione. –