#define CHECK_FOR_ERRORS(ret) \
if(ret != CY_U3P_SUCCESS) \
{ \
handleCriticalError(ret, __FILE__, __LINE__); \
}
预期用途:
CHECK_FOR_ERRORS(CyU3PPibInit(CyTrue, &pibClock));
没有返回变量,没有额外的代码行,只使用此宏包装重要的函数调用。
但它不起作用。宏不评估函数调用,它只将函数指针强制转换为int
。
我如何使这项工作?
答案 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替换使代码通常难以阅读。