좀 더 적절한 질문이라고 생각해서 약간의 제목을 변경했습니다.C++,이 goto 문이 보증되어 있습니까?
리팩터링 하시겠습니까 (goto의 합법적 인 사용처럼 보입니까)? go 명령문을 제거하려면 다음 코드를 어떻게 리팩토링합니까?
#ifdef HAVE_GPU
// attempt to use GPU device
if (data.device) {
try {
Integral::Gpu eri(S, R, Q, block.shell());
eri(basis.centers(), quartets, data.device);
}
// if GPU fails, propagate to cpu
catch(std::exception) { goto done; }
data.device += size;
host_index.extend(block_index);
block_index.data.clear();
done: ;
}
#endif
if (data.device) {
try {
...
}
catch(const std::exception&) { goto done; }
... // more things which should not be caught
done: ;
}
완전한 문을 사용하면
대부분의 선호도를 본 후, 나는 플래그와 함께 가기로 결정하지만, 씨 뉴욕의 의견에 감사드립니다.
감사합니다 모두
블록에 무엇이 있는지 보지 않고 말하기는 어렵지만, 또 다른 가능성은 if 함수 내에서 코드를 이동하는 것입니다. (가독성을 향상시킬 수도 있고 아닐 수도 있습니다.) 그런 다음 일이 잘못되면 일찍 돌아올 수 있습니다. – GManNickG
const 참조로 잡으십시오. –
@GMan은 완전한 성명을 추가했습니다. 폐쇄가 없으므로 기능이 과도 할 수 있습니다. – Anycorn