2013-05-12 1 views
0

||if (...)보다 입력 덜 상세하고 쉽게, 그래서 (내 코드에서 많이 발생하는) 다음을 수행 할 수있는 방법 싶습니다`return()`을 표현식으로 사용하는 방법은 무엇입니까?

int bar() {...; return successFlag;} 
int foo() { 
    bar() || return(...); // return early on errors 
    ... 
} 

를이 가능를?

foo을 통해 연결하는 대신 returnmain에서 bar으로 다시 전송할 수 있습니까?

+1

예외에 대해 읽고 싶을 수도 있습니다. 그리고 아니,'return'은 표현이 아니므로 그것을 사용할 수 없습니다. –

+0

그런 구문을 사용할 수 있습니다. 오류 참조 예외는 – qwr

+0

"더 나은"질문에 대해서는 예외가 있습니다. –

답변

2

첫 번째 부분은 아니요 : return은 표현식이 아니라 키워드이므로 해당 형식으로 조합 할 수 없습니다. 나는 당신이 본능적으로 영어의 의미에서 "또는"의미로 ||을 읽는다고 생각합니다 - 분명히 그것이 의미하는 바가 아닙니다.

두 번째 부분에서는 이론적으로 예외를 사용하여 수행 할 수 있지만 실제로는 바람직하지 않습니다. 예외는 "예외적 인 상황",보다 구체적으로 코드가 로컬에서 복구 할 수없는 오류 조건 (현재 기능/방법의 맥락에서)과 적절한 조치가 상위 레벨에서 결정되어야하는 오류 상황을위한 것입니다.

  • 성능 : 일반적인 흐름 제어 메커니즘으로 예외

    를 사용하여 두 가지 문제가있다 (즉, 일반적으로 발생한다 무엇 때문에) C++ 컴파일러는 "비 뛰어난"코드 경로에 최적화되고, 그래서 예외 처리 메커니즘은 매우 느려지는 경향이있다. 이것은 코드 최적화가 부족한 것이 아니라, 예외가없는 경우 비용이 0 또는 거의 0 인 메커니즘이 필요하기 때문에 예외 처리 비용이 많아도 처리 할 수 ​​있습니다.

  • 코드 명확성/테스트 가능성 : 제어 흐름에 대한 예외를 사용하면 코드를 매우 읽기 어렵게 만들고 단위 테스트를 올바르게 수행 할 수 있습니다.

+0

OP는 코드의 컨텍스트를 실제로 설명하지 못했지만 그의 코드 *에있는 주석은 false를 반환하는 bar가 오류를 나타낼 것이라고 말합니다. 따라서 OP의 상황이 "오류 코드를 로컬에서 복구 할 수없는 조건 "이 있습니다. – sepp2k

+0

아마도 'if (! bar()) return ERROR;의 초기 종료 스타일을 언급하는 것이 간단하고 명확 할 것입니다. 당신은 선명도를 위해 다음 줄로 돌아갈 수 있습니다. – Will

+0

@ sepp2k, 코드의 주석에 대한 요지를 봅니다. 나는 그것을 알아 차리지 못했다. 나는 물론 오류에 대한 복구를 말하면 예외는 완전히 적절한 메커니즘이라는 것에 동의합니다. –

-2

첫 번째 부분은 - 아니요. 두 번째의 경우 : setjmp와 longjmp. 그러나 둘 다 보통의 C++ 스택 기반 소멸자 호출을 파괴하고 아마도 예외와 잘 섞이지 않는다.

+2

나는 결코 setjmp/longjmp를 추천하지 않는다. 숙련 된 프로그래머가 독자적으로 그것에 대해 배울 수는 있지만 괜찮 으면 좋겠지 만 초보자에게는 너무 복잡하고 피트 덩어리로 가득합니다. –

관련 문제