일반적으로 c에서 goto 문은 쓰지 말라고, 혹은 절대로 쓰지 말라고 적혀 있는 책들이 많이 있다. 나도 처음에 c를 공부할 때는 goto 문은 절대로 쓰지 말아야 겠다는 강박 관념 비슷한게 있었다. 하지만 고수들(진짜로 프로그래밍을 잘한다고 인정할 만한 사람들)은 그런 제약을 신경쓰지 않는것 같다. 그 예로 goto 문의 활용만 봐도 정말로 코드가 이해하기 쉽고 잘 짜여지게 만들 수 있다는 점이다. 이런 걸 볼려면 잘 짜여진 많은 코드를 보면서 몸으로 느끼는 수 밖에...
아래 코드는 함수 f에서 메모리를 동적으로 할당 하였다가 문제가 생겼을때 동적 할당을 해제하는 것이다.
[code type=c]f(void)
{
int *a, *b, *c;
if ( ( a = malloc(100) ) == NULL )
{
return -1;
}
if ( ( b = malloc(100) ) == NULL )
{
free(a);
return -1;
}
if ( ( c = malloc(100) ) == NULL )
{
free(a);
free(b);
return -1;
}
/////////////////////////
}[/code]
위와 같이 resource를 제대로 해제해줘야 한다. 일반적으로 프로그램이 종료되면 운영체제가 알아서 사용했던 resource를 해제할 수도 있지만, 아닐 수 있으므로 이런 경우를 예방하기 위해 위와 같이 최소한 해제를 해줘야 한다.
하지만 위와 같은 경우 코드의 유지 보수와 코드 사이즈가 커지므로 힘들다. resource 추가나 해지시 free문을 일일이 수정해줘야 하므로....
아래와 같이 goto 문을 잘 활용하면 코드 자체가 간단해 지고 유지 보수가 쉬워 진다.
리눅스 커널에서 주로 많이 사용하는 기법이다.
[code type=c]if f(void)
{
int *a, *b, *c, *d;
int ret = 0;
if ( ( a = malloc(100) ) == NULL )
{
ret = -1;
goto a_err;
}
if ( ( b = malloc(100) ) == NULL )
{
ret = -1;
goto b_err;
}
if ( ( c = malloc(100) ) == NULL )
{
ret = -1;
goto c_err;
}
if ( ( d = malloc(100) ) == NULL )
{
ret = -1;
goto d_err;
}
///////
free(d);
d_err :
free(c);
c_err :
free(b);
b_err :
free(a);
a_err :
;
return ret;
}[/code]
네이버 원래 블로그 주소
http://blog.naver.com/asca99/80013207623
받은 트랙백이 없고,
댓글이 없습니다.



글
댓글을 달아 주세요
댓글 RSS 주소 : http://www.cipher.pe.kr/tt/cipher/rss/comment/117댓글 ATOM 주소 : http://www.cipher.pe.kr/tt/cipher/atom/comment/117