2010-12-19 8 views
4

외부 타사 C 라이브러리를 사용하는 C++ 라이브러리를 작성하고 있습니다. 따라서 제 도서관은 제 3 자 도서관의 기능을 호출 할 것이고 제 3 자 도서관은 제 도서관의 다른 부분을 다시 호출 할 것입니다.외부 링크 된 C 라이브러리의 예외 전파

이 경우 어떤 예외가 발생하는지 궁금합니다. MyLib :: foo()가 결국 MyLib :: bar()를 호출하는 외부 C 라이브러리 함수를 호출하고 막대가 예외를 throw합니다. 어떻게됩니까? 예외가 foo()의 핸들러에 올바르게 전달 될까요?

감사합니다.

답변

6

foo()의 처리기로 예외가 올바르게 전파됩니까?

외부 C 코드를 통해 예외가 전파되는지 여부는 미정입니다. 더 나쁜 것은 C 코드가 준비되지 않았기 때문에 예외를 처리 할 수 ​​없다는 것입니다. C 코드는 예기치 않은 갑작스런 반환에 대해 면역 할 필요가 없으므로 RAII 등을 알지 못합니다.

그런 상황에 직면했을 때 나는 C API로 돌아 가기 전에 예외를 잡아서 저장했습니다. 그 호출이 C API에서 돌아 왔을 때 다시 던졌다.

+2

이것은 내 대답보다 낫습니다. 제 3 자 라이브러리가 C++가 아닌 C 인 것을 보지 못했습니다. 질문자가 여러 번 언급하더라도. 잠깐. –

+0

정답입니다. 일부 구현 (GNU)이 예외를 C 코드에서 전파 할 수 있도록 시도하기는하지만이 방법을 사용하는 것은 매우 바람직하지 않습니다. 이식성이 떨어질뿐만 아니라 그 사이의 C 코드가 일관성없는 상태가 아니거나 아직 외부에서 기록되지 않았거나 해제 된 메모리 할당을 보유하지 않을 것이라고 가정 할 이유가 없습니다. 기껏해야 당신은 메모리 누출과 최악의 경우 무작위 충돌을 요구하고 있습니다. 문제를 해결하는 방법에 대한 sbi의 제안이 마음에 들지만 모듈 경계에서 예외를 던지지 않는 것이 좋습니다. –

+1

@ 토미 : 나는 왜 C 라이브러리를 통해 전파되는 예외가 당신의 대답에 대한 코멘트로 좋지 않은지에 대한 오랜 설명을 썼다. 당신이 코멘트를 저 지르길 원했을 때 이미 그것을 삭제했다면 심술이났다. 당신의 좋은 코멘트에 감사드립니다. ':)' – sbi

1

무거운 플랫폼 구현 세부 정보입니다. 일반적으로 예외 배관은 C 함수 활성화 프레임을 통해 스택을 풀 수 있습니다. CRT는 종종 C로 작성되기 때문에 필요합니다. 그러나 C 코드는 그것에 대해 만족할 것 같지 않습니다. 상태는 복원 될 수없는 돌연변이를 가지고 있습니다.

이 경우 Windows의 경우 C 코드에 문제가 발생합니다. C++ 예외는 구조적 예외 처리 (Structured Exception Handling, SEH)라고 불리는 Windows에 내장 된 일반적인 예외 지원을 지원합니다. __try 및 __except 키워드를 사용하여 C 코드 상태를 복원 할 수있는 예외 필터를 호출합니다. 분명히 이것은 휴대용이 아닙니다.

구현 세부 정보를 언급하지 않고 구현 세부 질문에 질문하지 마십시오.

1

읽기 (및 구입!) 허브 셔터의 C++ Coding Standards

# 62 : 는 예외 모듈 경계를 넘어 을 전파하는 것을 허용하지 않습니다.

관련 문제