'do-while(0)'에 해당되는 글 1건

  1. 2009.09.11 Google 친구들의 goto 피하기

Google 친구들의 goto 피하기

CS/Common 2009. 9. 11. 15:53
Google 친구 아저씨들이 짠 코드를 보면 가끔 이런 형식이 보인다.
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
: