2014-10-22 2 views
1

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); 
+1

메모를 업데이트되지 않습니다 – Creris

+0

그 지적 주셔서 감사합니다. 나는 그 순간을 바로 잡을 것이다. – SpencerD

+0

정말 인라인 함수 여야합니까? 예외를 잡는 함수가 너무 복잡해서 어쨌든 인라인 될 수 없다는 두려움이 있습니다. –

답변

1

예외없이 매크로를 사용해야합니다. 당신이 checkVariable() 기능을 감안할 때, 매크로는 다음과 같이 할 수 있습니다 :`(... 응답)의 경우와 코드의 마지막 조각 내부 objA` 것을

#define CHECK_VARIABLE(ptrVariable, objA) \ 
    {\ 
     int response = checkVariable((ptrVariable), &(objA));\ 
     if (response < 0)\ 
      return response;\ 
    } 
+0

음, 괜찮아. 매크로에서'try-catch' 문을 사용할 수 있습니까?그렇다면 매크로 정의 내에서'checkVariable'을 재 작성할 수 있습니까? 당신이 그것을 기꺼이 받아들이 려한다면, 내가 염두에두고있는 매크로를 보여주기 위해 나의 질문을 정말로 빨리 업데이트 할 것이다. – SpencerD

+1

네, 매크로 안에'checkVariable()'의 전신을 넣을 수는 있지만, 그렇게하지 말 것을 권합니다. 당신은 아무것도 얻을 수 없지만 그것을 디버그하고 매크로와 다르게 사용하는 능력을 잃어 버리게됩니다. –

1

:

#define CHECK_VARIABLE(ptrVariable, objA) \ 
{\ 
    if(!ptrVariable) return LIBRARY_A_NULL_PARAMETER;\ 
    try{\ 
     *objA = (libraryA::objectA *)ptrVariable;\ 
    }catch(...){\ 
     return LIBRARY_A_CAST_FAIL;\ 
    }\ 
} 

그때로 부를 것이다 예외를 이미 사용하고 있다면, 그 목적을 위해 사용할 수 있습니다. 너무 : 원하는하지만 그 함수의 호출자가 함께 전달되는 예외를 잡기 위해이 같은

inline signed int checkVariable(void *ptrVariable, libraryA::objectA **assignTo) { 
    if (!ptrVariable) { 
     throw LIBRARY_A_NULL_PARAMETER; 
    } 
    try { 
     *assignTo = (libraryA::objectA *)ptrVariable; 
     return 1; // success 
    } catch(...) { 
     throw LIBRARY_A_CAST_FAIL; 
    } 
} 

당신은 정확히 wrapper_doSomething 기능을 쓸 수 있습니다.

+0

죄송합니다. 질문을 업데이트하겠습니다. 래퍼는 C입니다. C++을 사용하여 C++ 라이브러리를 래핑하고 C에서 사용합니다. C에는 try-catch 처리기가 없습니다. 그럼에도 불구하고 대답 해 주셔서 감사합니다. – SpencerD

관련 문제