'C/C++'에 해당되는 글 1건

  1. 2007.01.04 C 에서 goto 사용하기. 2

C 에서 goto 사용하기.

|

나같은 경우에는 C로 프로그래밍을 할 경우에 거의 항상 goto 문을 사용한다.


근데, 항상 주변에서 goto 는 존재 자체가 악이라면서,

하도 쓰지 말라는 사람이 많아서 살짜쿵 고민을 했더랬다.


goto 문을 사용하면 100배는 더 편해지고, 명료해지는데 왜 쓰지 말라는건지;;;


goto 문은 이럴때 사용한다.


1. 예외 (에러) 처리

  1. int someFunction ( ... ) {
  2.     unsigned char* uniData = NULL;
  3.     FILE* fpR = NULL;
  4.   ... open file & allocate buffer ...
  5.     if ( fread(uniData, sizeof(char), rsize, fpR) < 0 ) {
  6.         printf("Error, cannot read file, %d\n", rsize);
  7.         goto EXIT;
  8.     }
  9.   ...  ...
  10. EXIT:
  11.      // Release resource & EXIT
  12.      SAFE_FREE(uniData);
  13.      if ( fpR != NULL ) fclose(fpR);
  14.      return 0;
  15. }

try .. catch ... finally 같이...

에러 때문에 함수를 나갈 경우에, 나가기 전 자원 해제를 위해서 쓰는 편이다.
( 예제에는 안썼지만 return 값을 -1로 설정하는 부분도 넣어야겠죠? )




2. 중복된 반복문을 한번에 벗어날때.

  1.   ...
  2. for ( i = 0; i < 100; i++ ) {
  3.     for ( j = 0; j < 100; j++ ) {
  4.         if ( buf[i][j] == '\n' )
  5.            goto EXIT_LOOP;
  6.     }
  7. }
  8. EXIT_LOOP:
  9.   ...


2개야 뭐 어떻게 한다고 쳐도, 10개쯤 중복된 반복문을 goto 없이 한번에 어떻게 벗어나죠? -_-

찾아보니 자바에도 저런 방식을 지원하더라고요,

  1. class BreakWithLabelDemo {
  2.     public static void main(String[] args) {
  3.         int[][] arrayOfInts = { { 32, 87, 3, 589 },
  4.                                 { 12, 1076, 2000, 8 },
  5.                                 { 622, 127, 77, 955 }
  6.                               };
  7.         int searchfor = 12;
  8.         int i;
  9.         int j = 0;
  10.         boolean foundIt = false;
  11.     search:
  12.         for (i = 0; i < arrayOfInts.length; i++) {
  13.             for (j = 0; j < arrayOfInts[i].length; j++) {
  14.                 if (arrayOfInts[i][j] == searchfor) {
  15.                     foundIt = true;
  16.                     break search;
  17.                 }
  18.             }
  19.         }
  20.         if (foundIt) {
  21.             System.out.println("Found " + searchfor +
  22.                                " at " + i + ", " + j);
  23.         } else {
  24.             System.out.println(searchfor
  25.                                + " not in the array");
  26.         }
  27.     }
  28. }

14번째 줄을 보면, 반복문을 시작할 때 반복문에 라벨을 지정해주고,

반복문 전체를 한번에 벗어나는 방법을 지원해주고 있습니다.
( continue도 라벨을 지정해주고 상위 반복문의 루프로 가는 방법을 지원해줌 )

출처: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/branch.html




물론 while 문으로 전체를 감싼 다음에 에러가 생기면 break를 걸어주는 방식으로 한다는 의견도 있지만,

저것도 에러 체크가 다른 반복문 안에 있으면 무용지물이지...

게다가 indent도 한단계 더 들어가야하잖아!!! goto 쓰는게 100배 나아!!!

...

난 이제는 goto 없이는 c programming이 힘들어지는....OTL
And
prev | 1 | next