Другой подход на основе макросов, который вы можете использовать, чтобы довольно легко устранить недостатки в C:
#define CHECK(x) do { \
int retval = (x); \
if (retval != 0) { \
fprintf(stderr, "Runtime error: %s returned %d at %s:%d", #x, retval, __FILE__, __LINE__); \
return /* or throw or whatever */; \
} \
} while (0)
Затем, чтобы вызвать его, у вас есть:
CHECK(doSomething1());
CHECK(doSomething2());
// etc.
Для бонусных балловможет легко расширить макрос CHECK, чтобы получить второй аргумент y, что делать при сбое:
#define CHECK(x, y) do { \
int retval = (x); \
if (retval != 0) { \
fprintf(stderr, "Runtime error: %s returned %d at %s:%d", #x, retval, __FILE__, __LINE__); \
y; \
} \
} while (0)
// We're returning a different error code
CHECK(someFunction1(foo), return someErrorCode);
// We're actually calling it from C++ and can throw an exception
CHECK(someFunction2(foo), throw SomeException("someFunction2 failed")):