2014-10-22 3 views
1

У меня есть обертка 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); 
+1

к сведению, что 'objA' внутри последней части кода с, если (ответ ...) не будет обновляться – Creris

+0

Спасибо за указание на это. Я исправлю это на мгновение. – SpencerD

+0

Нужно ли быть встроенной функцией? Я боюсь, что функция, которая ловит исключения, будет слишком сложной, чтобы быть встроенной в любом случае. –

ответ

1

Без исключений вы должны использовать макросы. Учитывая, у вас есть checkVariable() функцию, макрос может выглядеть следующим образом:

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

Хм хорошо. Могу ли я использовать выражения 'try-catch' в макросе?Если да, могу ли я переписать 'checkVariable' внутри определения макроса? Если вы захотите это развлечь, я очень быстро обновлю свой вопрос, чтобы показать макрос, который я имею в виду. – SpencerD

+1

Да, вы можете поместить все тело 'checkVariable()' внутри макроса, но я бы не советовал это делать. Вы ничего не получаете, но теряете способность отлаживать его и использовать его иначе, чем от макроса. –

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 точно по желанию, но абонент этой функции должен поймать исключение, которое передается вместе.

+0

Прошу прощения, я уточню свой вопрос. Оболочка для C. Я использую C++ для упаковки библиотеки C++ и использую ее в C. C не имеет обработчика try-catch. Спасибо за ответ, тем не менее. – SpencerD

Смежные вопросы