複数の式からなる関数マクロに、こんな表現があった。 #define nullcheck(x) do { \ if (x == NULL) { \ printf("NULL!\n"); \ } else { \ printf("not NULL!\n"); \ } \ } while(0) なぜdo〜while(0)で囲ってあるのかと思ったが、こうすることによって文末のセミコロンが抜けた場合にコンパイルが通ってしまうことを避けられるから、のらしい。 /* コンパイル通る */ #define nullcheck1(x) if (x == NULL) { \ printf("NULL!\n"); \ } else { \ printf("not NULL!\n"); \ } int main(int argc, char* argv[]) { int *x = NULL; nullcheck1