Powiel możliwe:
Do-While and if-else statements in C/C++ macrosjak funkcja makro klamrami lub do..while
gcc (GCC) 4.7.2
c89
Witam,
Mam następujących funkcji, jak i po prostu makro zastanawiasz się, jakie jest preferowane użycie podczas korzystania z wielu linii. Lepiej używać nawiasów klamrowych lub pętli do.czasu (0).
Zwykle używam do..while (0) do wszystkiego. Ale widziałem kilka projektów, w których używają tylko nawiasów klamrowych i nie jestem pewien, który z nich byłby lepszy.
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);
kręcone szelki
#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; \
}
Jedyną różnicą jest to, że średnik zostanie ustawiony w pętli do..while a nie w nawiasy.
Wielkie dzięki za wszelkie sugestie,
Mój Boże, to jest brzydki kod. (nie zamierzam popełnić przestępstwa, jestem po prostu bardzo zaskoczony). – rubenvb
Dodanie średnika na końcu 'do {...} while (0)' w pierwszej kolejności uniemożliwia użycie 'do {...} while (0)'. Wadą wersji tylko nawiasów klamrowych jest to, że nie można napisać 'if (something) DSO_ERROR (...); else {...} 'ponieważ średnik jest pustą instrukcją po tym, jak' if' i 'else' jest błędem składni. W poprawionej wersji 'do {...} while (0)' notacja 'if' /' else' działa tak, jak byś się spodziewała, gdyby makro było rzeczywiście funkcją. –