do {} while(0) 문은 매크로로 정의된 리눅스 커널 헤더에서 흔하게 볼 수 있다 인라인 펑션과는 또다른 쓰임새가 있다.
do { } while(0) 로 선언해두면 다른 문장 없이 {} 로 씌울 때 에러나는 컴파일러에서 유용하다.
당해본 사람들은 알겠지만 {} 중괄호 없이 매크로 정의 함수를 쓸 때 if ~ else 문 등에서 다양한 버그가 유발된다.
if ( ... ) a 문
else b 문
여기서 b 문에는 중괄호 {} 가 없으므로 else 뒤 단 한 문장만이 실행된다. 매크로 함수에 중괄호를 둘러치지 않았다면 매크로 함수의 최초 한 줄 만이 실행될 것이다.
do ~ while(0)는 사실 그 보다 continue를 통해 유용한 경우가 많다.
do {
a = looping_job()
if ( a != b) {
continue;
} else break;
} while(0);
애초에 do ~ while(0)는 순환문으로서의 가치가 별로 없지만 continue 문을 통해서 순환문의 가치를 부여 받는다.
이런 형식의 문장을 잘 쓰면 블럭 인덴트 판독이 어려운 대형 if 블럭, 에러 처리 상태 머쉰이 복잡하여 에라 모르겠다 goto 로 헤쳐모여 식의 문장을 상당히 구조적으로 바꿀 수도 있다.
원패스로 통과시킬 코드가 본 흐름이고, continue로 순환문으로, break로 빠른 탈출 goto 처럼 쓸 수 있다.