2012-01-19 2 views
1

나는이 다음 코드 :C++ 고토 (계속보다는) 구문 이상한

do 
{ 
    doStuffP1(); 
    if (test) 
    { goto skip_increment; 
    } 
    dostuffP2(); 

    skip_increment: 
    // 1; // Only works if I remove the comment at line start. 
} while (loop); 

컴파일되지 않는 (++ 2010 VC)이 오차 :

file_system_helpers.cpp(109) : error C2143: syntax error : missing ';' before '}' 

I가 그것을 변경하는 경우 :

skip_increment: 

1; 

컴파일 (및 작동).

이것은 실제로 C++ 구문의 제한 사항입니까?

답변

6

"1;"이라고 가정합니다. 첫 번째 코드 스 니펫에서 누락 되었습니까? 여기에이 문법에서

봐 : 이것은 단지 "이라는 문"으로 라벨을 정의 http://www.lysator.liu.se/c/ANSI-C-grammar-y.html

. 즉, 블록 본문은 해당 내용 시퀀스의 어느 곳에서나 label: <statement>을 포함 할 수 있지만 레이블 뒤의 명령문은 선택 사항이 아닙니다. 따라서 skip_increment: }이 유효하지 않게됩니다.

(그리고, OK, 당신은 ++이 아닌 C C를 사용하고,.하지만 난 고토의 추가 사용에 대한 수당을 만드는 것은 뭔가 누군가가 C++ 언어를 정의하는 반면에 대해 많이 걱정이라면 의심)

+0

나는'고토 인식 '는 거의 보편적으로 싫은 것이지만 내부 루프에서 외부 루프를 '계속'하는 훌륭한 방법은 없다. 내가 생각할 수있는 유일한 방법은 여분의 변수 (바깥 쪽 루프가'continue'인지 아닌지를 저장하는'bool')를 포함합니다. –

+1

나는 여분의'bool'을 사용하는 것이'goto'보다 낫지 만, 나는 프로그래머로서 경험이 없다고 주장한다. 나는'goto' 자체가 사용할 안전한 진술이라고 믿지 않으며, 여분의 변수는 그다지 비용이 들지 않을 것입니다. 그렇습니까? 하지만 그것은 제 2c입니다. ^^ ' – blahman

+2

코드를 함수에 추출하고 조기 반환을 사용하십시오. –