内联返回原始调用者

时间:2014-10-22 22:19:04

标签: c++ return inline

我有一个C ++包装器来包装C库。包装器经常执行变量检查。我想将其分解为内联函数调用,但如果检查失败,我希望内联函数返回到原始调用者。

为了简单起见,我们将调用我包裹的库libraryA,我们将调用库的对象objectA

这就是我正在做的事情:

#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 */
}

因为几乎每个函数都执行此检查,所以我想将其简化为:

#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 */
}

如果检查失败,我希望checkVariable()函数返回原始调用者。

因为所有错误代码都是负数,我当然可以说:

int response = checkVariable(ptrVariable, &objA);
if(response < 0){
    return response;
}

这会处理这种情况,但如果可能的话,我想删除if-statement,从而将变量检查减少到恰好一行。这可以实现吗?

我打算查看宏,但我之前没有使用过宏,所以我不确定他们是否能够实现这一点。


修改

根据安东的回答,像这样的宏观定义是否足够:

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

我会称之为:

CHECK_VARIABLE(ptrVariable, &objA);

2 个答案:

答案 0 :(得分:1)

由于您已经使用了例外,您也可以将它们用于此目的:

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函数,但该函数的调用者必须捕获传递的异常。

答案 1 :(得分:1)

没有例外,您必须使用宏。鉴于您具有checkVariable()功能,宏可以如下所示:

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