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

C语言中简洁、非突兀的错误处理,c,error-handling,C,Error Handling,预期用途: CHECK_FOR_ERRORS(CyU3PPibInit(CyTrue, &pibClock)); 没有返回变量,没有额外的代码行,只有用这个宏包装重要的函数调用 但它不起作用。宏不计算函数调用,它只将函数指针投射到int 如何实现这一点?宏调用函数两次,第一次是实际调用,第二次是错误处理调用。试试这个: #define CHECK_FOR_ERRORS(ret) \ do { int r = ret; if (

预期用途:

CHECK_FOR_ERRORS(CyU3PPibInit(CyTrue, &pibClock));
没有返回变量,没有额外的代码行,只有用这个宏包装重要的函数调用

但它不起作用。宏不计算函数调用,它只将函数指针投射到
int


如何实现这一点?

宏调用函数两次,第一次是实际调用,第二次是错误处理调用。试试这个:

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

您可以看到如何使用gcc的
-E
标志或编译器的类似标志解释宏。一般来说,在宏定义中尽量只使用一次每个宏参数,以防止出现此类问题。

我个人认为这样做会容易得多。假设
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*/

这样您就有了简单易懂的代码。宏替换使代码通常难以阅读。

宏在编译时运行,因此它们从不计算函数调用。您应该将宏看作是由预处理器扩展的奇特的文本替换设备。@HetePerfan,我可以用函数来实现吗?有什么吗?我认为它工作得很好!我正在替换一个更详细的错误报告方案,代码的大小减少了一半!
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*/