C语言中的简洁和非突兀的错误处理

时间:2013-12-13 16:00:20

标签: c error-handling

Error handling in C code

#define CHECK_FOR_ERRORS(ret)                           \
    if(ret != CY_U3P_SUCCESS)                           \
    {                                                   \
        handleCriticalError(ret, __FILE__, __LINE__);   \
    }

预期用途:

CHECK_FOR_ERRORS(CyU3PPibInit(CyTrue, &pibClock));

没有返回变量,没有额外的代码行,只使用此宏包装重要的函数调用。

但它不起作用。宏不评估函数调用,它只将函数指针强制转换为int

我如何使这项工作?

2 个答案:

答案 0 :(得分:2)

您的宏调用该函数两次,首先是实际调用,以及调用错误处理。试试这个:

#define CHECK_FOR_ERRORS(ret)                           \
    do { int r = ret; if (r != CY_U3P_SUCCESS) {\
    handleCriticalError(r, __FILE__, __LINE__);   \
    } while(0)

您可以看到如何使用gcc的-E标志或编译器的类似标志来解释宏。通常,尝试在宏定义中仅使用每个宏参数一次以防止此类问题。

答案 1 :(得分:0)

就个人而言,我会更容易做到这一点。假设CyU3PPibInit(CyTrue, &pibClock)初始化某个库,如果成功则返回0。我会做类似以下的事情:

if ( CyU3PPibInit(CyTrue, &pibClock) != 0){
    fprintf(stderr, "At %s : %d: unable to load CyU3PPibInit, ", __FILE__, __LINE__);
    /*eiter abort here or sets some variable that your subsequent program flow doesn't use  this library */
}
/*continue without the library*/
通过这种方式,您可以轻松理解代码。 Marco替换使代码通常难以阅读。