1 min read

커널에 do while 매크로가 있을까?

리눅스 커널을 보면 아래와 같이 do {} while 매크로가 있다.

https://github.com/raspberrypi/linux/blob/f6b3ac28f0a9137d4c24c0b8832e693bbd16f5b7/include/linux/hardirq.h#L36

do ~ while로 매크로 함수를 사용하는 두가지 이유가 있다.

첫째는 {} 을 통해서 중복이름을 막는다.

매크로 함수는 말그대로 컨트롤 C+V효과를 동일한 효과가 있어 중복이름이 있을때

undefined behavior이 된다. 이를 방지 하기 위해 블록을 사용한다.

둘째 ; 을 강제화한다.

여러개의 함수를 define을 하게되면 ;을 포함해서 아래와 비슷한 매크로함수를 만들게 되는데

#define __MAX_FN {a();b();}

이는 매크로 함수를 사용할때 ;을 사용안해도 된다. 하지만 do while인 경우에는 ;을 강제화 할수 있다는 장점이 있다.

이를 방지하기 위해 gcc에서두 아래와 같은 키워드를 만들었지만 리누스 토발즈님은 종속성을 매우 싫어하여 이를 사용안할거같다.

https://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Statement-Exprs.html