2012-12-04 1 views
0

저는 30 년 넘게 개발중인 존경받을만한 프로젝트 인 BRL-CAD에 대한 코드를 작성했습니다. 파일을 수정하는 동안 이상한 논리, 특히 오류가 발생했을 때 함수를 종료하는 수단으로 goto를 사용하는 것으로 나타났습니다. 제가 읽은 모든 책은 모든 고토가 더 나은 대체물을 가지고 있다는 사실을 설교합니다. 그러나이 경우에는 고토가 최선의 선택이 될 수있는 출처에 동의합니다. 주어진 :함수 내에서 goto를 사용하여 종료하는 방법

tables.c는 프로그램에서 데이터 테이블을 정렬하고 가져 오는 데 사용되는 3 개의 함수가 들어있는 큰 파일입니다. http://pastebin.com/u4jnNbLu

if ((tabptr=fopen(argv[1], "w+")) == NULL) { //takes place 300-400 lines before the end goto is declared 
    bu_vls_printf(gedp->ged_result_str, "%s: Can't open %s\n", argv[0], argv[1]); 
    status = GED_ERROR; 
    goto end;} 

고토 끝 :

end: //frees memory used in function and returns the status(which became an error above) 
    bu_vls_free(&cmd); 
    bu_vls_free(&tmp_vls); 
    bu_ptbl_free(&cur_path); 

    return status; 

이 함수로 고토를 사용하는 것입니다 아래 오류를 확인하고 오류가 발생하면 고토 안타 코드 조각은 전체 파일입니다 중단 ok? 난 전에도 그렇게 생각하지 않았지만, 혼란스러운 중괄호에 코드를 두는 것보다 더 논리적 인 것처럼 보입니다. 그리고/if/else는 오류가 있는지 확인하기 위해 끊임없이 코드를 쳐다 봅니다.

+1

C ** 또는 ** C++? 각 언어의 베스트 프랙티스는 매우 다르다. 예를 들어 'goto'는 C++에서 거의 사용하지 않는다. (나는 아무도 주장하지 않는다.) C에서는 클린업 코드로 점프하는 꽤 표준적인 방법이다. 귀하의 게시물을 참조하십시오. – GManNickG

답변

2

goto는 나쁜 평판을 가지고 있지만 사용해서는 안된다는 의미는 아닙니다. 나는 특정 오류 케이스를 처리하기 위해 C에서 수년간 goto를 사용해 왔습니다.

당신은 고토가 논문의 경우 너무 사용되는 리눅스 커널의 코딩 스타일에서 찾을 수 있습니다 GOTO still considered harmful?

3

이것은이다 : 당신은 여기에 C에서 고토의 사용에 관한 토론을 찾을 수 http://www.kernel.org/doc/Documentation/CodingStyle

순수한 C (그리고 오류에 대한 예외 대신에 반환 값을 사용하는 일부 C++)의 일반적인 구조이며 완벽하게 수용 가능한 IMO입니다. 이렇게하면 모든 정리가 한 곳에서 (또는 함수의 구조에 따라 가능한 한 한 곳 가까이에) 유지되고 모든 내용이 올바르게 작동하는지 확인하기 위해 중첩 된 if의 얽힌 웹보다 훨씬 쉽게 읽고 유지 관리 할 수 ​​있습니다 .