Google 친구들의 goto 피하기
CS/Common 2009. 9. 11. 15:53Google 친구 아저씨들이 짠 코드를 보면 가끔 이런 형식이 보인다.
foo()나 bar()에서 실패시 이후의 코드를 처리하지 않기 위함인데,
결국은 리눅스 커널의 네트워크 관련 코드의 다음과 같은 일을 한다.
결국 goto를 사용하지 않고, do-while(0) 을 이용하여 break를 사용해서 분기를 제어한 것인데,
나는 커널 코드에 익숙해져 있어서 인지, goto가 더 명시적이고 좋아 보인다.
또한 do-while(0)과 break를 이용한 방법은 그 안에 loop가 없는 경우만 사용할 수 있는 단점도 있다.
하지만,
요렇게 된 코드를
요렇게 쓸 수 있다는 점에서는 참 매력적인 방법이다.
첨에 이 코드를 봤을때는 그냥 그렇구나 하고 지나갔었다.
그런데 우연히 미팅 시간에 팀원들과 이 코드에 대해서 얘기를 하게 되었는데, 사람들이 좋은 방법이다... 라고 대부분 얘기 하길래 포스팅 까지... 역시 셀로판귀... 팔락팔락... orz
do { result = false; ... if ( result = foo() ) break; ... if ( result = bar() ) break; ... } while (0); if (false == result) { ... }
foo()나 bar()에서 실패시 이후의 코드를 처리하지 않기 위함인데,
결국은 리눅스 커널의 네트워크 관련 코드의 다음과 같은 일을 한다.
if ( result = foo() ) goto FAILED; ... if ( result = basr() ) goto FAILED; ... FAILED : ...
결국 goto를 사용하지 않고, do-while(0) 을 이용하여 break를 사용해서 분기를 제어한 것인데,
나는 커널 코드에 익숙해져 있어서 인지, goto가 더 명시적이고 좋아 보인다.
또한 do-while(0)과 break를 이용한 방법은 그 안에 loop가 없는 경우만 사용할 수 있는 단점도 있다.
하지만,
if ( ) { if ( ) { if ( ) { if ( ) { ... } } } }
요렇게 된 코드를
do { if (! ) { break; } if (! ) { break; } if (! ) { break; } if (! ) { break; } } while(0);
요렇게 쓸 수 있다는 점에서는 참 매력적인 방법이다.
첨에 이 코드를 봤을때는 그냥 그렇구나 하고 지나갔었다.
그런데 우연히 미팅 시간에 팀원들과 이 코드에 대해서 얘기를 하게 되었는데, 사람들이 좋은 방법이다... 라고 대부분 얘기 하길래 포스팅 까지... 역시 셀로판귀... 팔락팔락... orz