C 용 라이브러리를 래핑하는 C++ 래퍼가 있습니다. 래퍼는 변수 검사를 자주 수행합니다. 이것을 인라인 함수 호출로 분해하고 싶습니다만, 검사가 실패하면 원래 호출자에게 인라인 함수를 반환하고 싶습니다.인라인 원래 호출자에게 돌아 가기
간단히하기 위해 우리는 libraryA
을 감싼 라이브러리를 호출 할 것이고 라이브러리의 객체는 objectA
이라고 부를 것입니다. 내가 좋아하는 것
#define LIBRARY_A_NULL_PARAMETER -1
#define LIBRARY_A_CAST_FAIL -2
inline signed int checkVariable(void *ptrVariable, libraryA::objectA **assignTo){
if(!ptrVariable){
return LIBRARY_A_NULL_PARAMETER;
}
try{
*assignTo = (libraryA::objectA *)ptrVariable;
return 1; // success
}catch(...){
return LIBRARY_A_CAST_FAIL;
}
}
signed int wrapper_doSomething(void *ptrVariable){
libraryA::objectA *objA;
/* variable checks */
checkVariable(ptrVariable, &objA);
/* perform the rest of the function */
}
:이 검사는 거의 모든 기능을 수행한다
#define LIBRARY_A_NULL_PARAMETER -1
#define LIBRARY_A_CAST_FAIL -2
signed int wrapper_doSomething(void *ptrVariable){
libraryA::objectA *objA;
/* variable checks */
if(!ptrVariable){
return LIBRARY_A_NULL_PARAMETER;
}
try{
objA = (libraryA::objectA *)ptrVariable;
}catch(...){
return LIBRARY_A_CAST_FAIL;
}
/* perform the rest of the function */
}
때문에, 나는 같은이를 단순화하고 싶습니다 : 여기
내가 뭘하는지입니다 검사가 실패 할 경우checkVariable()
함수는 원래 호출자에게 다시 돌아가는 함수입니다.
int response = checkVariable(ptrVariable, &objA);
if(response < 0){
return response;
}
이 상황을 처리 할 것입니다,하지만 난 가능하면 if-statement
을 제거하고, 따라서에 변수 확인을 줄이기 위해 싶습니다
모든 오류 코드가 음수이기 때문에, 나는 물론 말할 수있다 정확히 한 줄. 달성 가능합니까?
매크로를 조사 할 계획이지만 이전에 매크로를 사용하지 않았으므로이 중 하나를 수행 할 수 있는지 확실하지 않습니다.
편집 :
당 안톤의 대답 것이 충분할 같은 매크로 정의 : 당신으로
CHECK_VARIABLE(ptrVariable, &objA);
메모를 업데이트되지 않습니다 – Creris
그 지적 주셔서 감사합니다. 나는 그 순간을 바로 잡을 것이다. – SpencerD
정말 인라인 함수 여야합니까? 예외를 잡는 함수가 너무 복잡해서 어쨌든 인라인 될 수 없다는 두려움이 있습니다. –