2011-02-27 3 views
40

함수 호출 할 때 :스위치 "제어 전송의 초기화를 우회 :"나는이 '컨트롤의 전송이 초기화 우회 "얻을

switch (retrycancel) 
{ 
    case 4: //The user pressed RETRY 
     //Enumerate all visible windows and store handle and caption in "windows" 
     std::vector<MainHandles::window_data> windows = MainHandles().enum_windows().get_results(); 
     break; 

    case 2: 
     //code 
} 

그것은 무언가를 가지고 난 다음 스위치를 빌드 할 때 오류 내 열거 함수를 호출하는 것과 관련있다. 스위치 내에서 함수를 호출 할 수 없으면 이런 종류의 문제에 대한 해결 방법이 있습니까?

답변

55

섹션 C++ 표준의 6.6.4 :

무조건 전송은 상기 식별자에 의해 표시된 문장 에 제어를 GOTO 문. 식별자는 현재 기능에있는 레이블 (6.1) 이어야합니다.

섹션 C++ 표준의 6.7 :

블록으로 전송하는 것이 가능하지만, 하지 초기화와 선언을 우회하는 방법이다. 자동 저장 기간이 로컬 변수는이 범위에있는 포인트 범위에없는 점 에서 점프 프로그램이다 잘못 형성된 변수 POD 형 (39)을 갖고 선언하지 않는 한 초기화

강조 나 추가. switch이 (가) 실제로는 goto 인 것처럼 보이므로이 문제가 발생합니다. 당신이 windowsvector을 만드는 달성을 기대하는지 나에게 분명하지 비록 당신이 switch

switch (retrycancel) 
    { 
    case 4: 
    { 
     const std::vector<MainHandles::window_data> windows(
      MainHandles().enum_windows().get_results() 
     ); 
     break; 
    } 
    case 2: 
     //code 
    } 

를 사용하거나 if/else

if (retrycancel == 4) { 
    const std::vector<MainHandles::window_data> windows(
     MainHandles().enum_windows().get_results() 
    ); 
} else if (retrycancel == 2) 
    // code 
} else { 
    ... 
} 

에 리팩토링해야하는 경우이 문제를 해결하려면 중괄호를 추가 switch 안에 있으므로 디자인을 다시 생각해 볼 수 있습니다. 참고 예에서 수정되지 않았으므로 const 한정자를 windows에 추가했습니다.

+0

이 당신의 대답에 감사 문제를 해결할 것입니다, 그것은 조금 늦게 어제 ;-). 그럼에도 불구하고 나는 else else 루프를 제안 할 것이다. 인용 한 C++ 표준의 공식 소스는 무엇입니까? – Lumpi

+0

@ Lumpi는 ISO C++ 표준으로, 얼마 전에 복사본을 구입했습니다. –

+1

@SamMiller : 스위치 케이스에 중괄호가 필요한 이유를 간단히 설명해주십시오. 스위치 개체 중 하나에서 새 개체를 만들었고 일반 변수를 선언하거나 초기화하면 컴파일러 오류가 발생합니다. 나는 어떤 오류도 내지 않는다. – tanz

11

스위치는 본질적으로 goto입니다. 즉, 적절한 레이블에 goto입니다. C++ 표준은 goto가 POD가 아닌 객체의 초기화를 우회하는 것을 금지합니다. 내가 스위치, "진짜"일이 더 의미에 잘못된 함수 호출을 복사 할 수 있도록 괄호로 벡터 선언을하고

switch (retrycancel) 
    { 
    case 4:    //The user pressed RETRY 
    { 
     std::vector<MainHandles::window_data> windows = MainHandles().enum_windows().get_results(); //Enumerate all visible windows and store handle and caption in "windows" 
     break; 
    } 
    case 2: 
     //code 
    } 
+0

감사합니다. 언급했듯이, 그것은 고토이며 적절한 프로그래밍을 배우려고 할 때 샘 밀러 (Sam Miller)가 제안한 if else 블록과 함께 갈 것이라고 생각합니다. – Lumpi

관련 문제