为什么要在宏中使用看似毫无意义的 do-while 和 if-else 语句?

#define FOO(X) do { f(X); g(X); } while (0)
#define FOO(X) if (1) { f(X); g(X); } else
#define FOO(X) f(X); g(X)

答案