C++ 예외 클래스 작성 중 (C++에서 예외 발생을 C API를 통해 다른 언어로 전달할 수 있음).C++ 사용자 정의 예외 : 런타임 성능 및 C++에서 C로 예외 전달 (오류 정보)
//C++
myClass
{
public:
myClass();
~myClass();
void foo() // throws myException
int foo(const int i, const bool b) // throws myException
} * myClassPtr;
// C API
#ifdef __cplusplus
extern "C" {
#endif
myClassPtr MyClass_New();
void MyClass_Destroy(myClassPtr p);
void MyClass_Foo(myClassPtr p);
int MyClass_FooBar(myClassPtr p, int i, bool b);
#ifdef __cplusplus
};
#endif
은 내가 C 측에 C++ 코드에서 발생한 예외를 통과 할 수있는 방법이 필요합니다 다음과 같이 공격
내 초기 계획은 진행하는 것이 었습니다. C 측에 전달하고자하는 정보는 다음과 같습니다.
(a). 무엇 (b). Where (c). 간단한 스택 추적 (발생한 순서대로 오류 메시지 시퀀스, 디버깅 정보 없음)
API 함수가 예외를 포함하는 구조체 ExceptionInfo에 대한 포인터를 갖도록 C API를 수정하고 싶습니다. info (예외가 발생했을 경우) 호출의 결과를 소비하기 전에 이 같은
그래서 C의 API에 노출 C++ 방법이 구현 될 것 인 무엇인가 :
// 내가 구현 (옆 유지 보수 악몽) 이런 종류의에 대한 미치 'hackish'뭔가가 인정해야 - THER이어야합니다 더 나은 방법? 는 C API에 노출 된 C++ 각 방법의
// ExceptionInfo default ctor initialized to no error
void MyClass::foobarTrappedExceptionWrapper(ExceptionInfo& ei)
{
try {
// call foobar ...
foobar();
}
catch(fast_exception& fe)
{
switch (fe.errcode())
{
//package exception info into ei for C consumption
}
}
catch(std::exception &e)
{
//package exception info into ei for C consumption
}
}
구현 (조각 위에 참조) 시도/catch 문에 동봉 될 필요가있다. 이에 대한 성능에 영향 (이 article에 따라) 매우 심각한 것 :
, 나는 예외가 실제로 발생했을 때 모든 예외 처리 비용이 있지만, 그것은 비싼 becmes, 내 C++ 일 어딘가에서 읽은 기억한다. 그래서, 맞습니까? 어떻게해야합니까? 오류를 안전하게 트랩하고 결과 오류 정보를 C API에 전달할 수있는 다른 방법이 있습니까? 또는이 사소한 고려 사항입니다 (결국 기사, 꽤 오래된 하드웨어가 그 이후로 조금 향상되었습니다).은 "그것은 실수 (높은 런타임 비용) 이벤트 자주 발생하는 이벤트 또는 에 대한 처리 C++ 예외를 사용하는 탐지 지점 근처에서 처리됩니다. " 동시에
나는 간단한 스택 추적 here를 생성하는 방법을 발견 이후 [편집]
제거 question2.
체크 표시를 사용하여 이전 질문에 대한 대답을 수락하는 것을 잊지 마십시오. 자세한 내용은 * "여기에 질문하는 방법"*을 참조하십시오. 또한 유용한 답변에 투표하는 것을 잊지 마십시오. 여기가 가장 기본적인 답변입니다. –