2012-12-07 17 views
6

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,

+1

Mój Boże, to jest brzydki kod. (nie zamierzam popełnić przestępstwa, jestem po prostu bardzo zaskoczony). – rubenvb

+3

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ą. –

Odpowiedz

7

kręcone wersja klamra złamie wykorzystanie tak:

if(foo) 
    DSO_ERROR("Foo occured!", my_module, the_pool, 4711); 
else 
    printf("All is well, there is no foo\n"); 

która jest bardzo powodem do ... while(0) konstruktu. Wydaje się, że warto tego unikać.

+2

Zgodnie z OP, wersja do ... while (0) również się zerwie, ponieważ na końcu ma dodatkowy średnik. Właściwy sposób zapisu do ... while (0) jest bez średnika. –

2

Zwykle zrobić nie mają średnik na do { ... } while (0) w makro.

Powodem, dla którego masz makro do { ... } while (0), jest możliwość użycia makra w źródle i dodanie średnika bez dodatkowego, pustego wyciągu. Jest tak głównie z powodów historycznych, ponieważ posiadanie pustych zdań (to jest tylko średników bez żadnych instrukcji) w wielu przypadkach nie przynosi niczego.

+5

"... nic nie robi" z wyjątkiem zwisania z innego problemu –

4

będziesz mieć problem z tym kodem:

if (one) 
    DSO_ERROR("one", ...); 
else 
    DSO_ERROR("two", ...); 

więc jeśli użyć do-while-Macro BEZ średnikiem, to będzie dobrze.

Powiązane problemy