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*/