Diferencia entre macros con y sin usar do … while

Posible duplicado:
Sentencias Do-While y if-else en macros C / C ++

Tengo las siguientes macros:

#define FREE1(x) do { free(x); x = NULL; } while (0) #define FREE2(x) free(x); x = NULL 

¿Cuál es la diferencia entre estas macros?

Considere el siguiente ejemplo

 if (some_test) FREE2(x); 

se expande a

 if (some_test) free(x); x = NULL; // happens regardless of value of some_test 

Podría ser más satisfactorio resolver esto usted mismo.

Insinuación:

 if(y) FREE2(x);