Если использование короткозамкнутого ||
, как предложено в другом ответе, не вариант, вы можете определить для этого макрос:
#define TRY(var, x) if ((var = (x))) return var
Тогда в вашем коде:
short Function()
{
short ret;
TRY(ret, FunctionA());
TRY(ret, FunctionB());
TRY(ret, FunctionC());
return 0;
}
ПРИМЕЧАНИЕ : Вы должны быть очень осторожны при решении использовать макросы, но в этом случае я думаю, что может быть чистым способом решения проблемы.
Следует отметить, однако, что эти утверждения скрывают тот факт, что функция может возвращаться рано в каждом из них. Если у вас есть дескрипторы открытых ресурсов (файловые дескрипторы, указатели на malloc
ed данные, ...), они будут утечки. Вы и все, кто работает с кодом, должны знать об этом и использовать соответствующие процедуры обработки ошибок и очистки для более сложных случаев, чем этот.