У меня есть обертка C++ для обертывания библиотеки для C. Обертка часто выполняет проверку переменной. Я хотел бы разбить это на встроенный вызов функции, но я бы хотел, чтобы встроенная функция возвращалась к исходному вызывающему, если проверка завершилась с ошибкой.Inline возврат к исходному вызывающему абоненту
Для простоты мы позвоним библиотеке, которую я обернул 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
, если это возможно, и, таким образом, уменьшить переменную чек ровно одна строка. Возможно ли это?
Я планирую искать макросы, но раньше я не использовал макросы, поэтому я не уверен, что они могут это сделать.
EDIT: ответ
Per Антона, будет макроопределение, как это будет достаточно:
#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);
к сведению, что 'objA' внутри последней части кода с, если (ответ ...) не будет обновляться – Creris
Спасибо за указание на это. Я исправлю это на мгновение. – SpencerD
Нужно ли быть встроенной функцией? Я боюсь, что функция, которая ловит исключения, будет слишком сложной, чтобы быть встроенной в любом случае. –