我有一个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);
答案 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;\
}