我的代码中使用了一个宏来包装函数调用并检查返回代码。宏非常简单:
#define CALL_POP(FUNC) \
do \
{ \
my_errno = FUNC; \
if (unlikely(my_errno != SUCCESS)) goto fn_exit; \
} while (0)
但是,在使用-Wall
和-O3
进行编译时,我的编译器(GCC 5.3.1)会抱怨未初始化的变量:
filename.h:194:10: warning: 'my_errno' may be used uninitialized in this function [-Wmaybe-uninitialized]
if (unlikely(my_errno!=SUCCESS)) goto fn_exit; \
^
这看起来很奇怪,因为变量在之前的行上清楚地初始化并在其他地方声明(在调用此宏之前)。
以下是调用此宏的示例:
int my_errno;
CALL_POP(send
(&ctrl, NULL, 0, recv->remote_info.origin_rank,
recv->comm_ptr, recv->remote_info.ackreq, FALSE));
...
fn_exit:
return my_errno;
有没有人知道为什么抱怨我的用法?
答案 0 :(得分:-2)
我相信你错过了一些转义,以便在宏名称之后逃脱换行符,
类似
#define CALL_POP(FUNC) \
do { \
// stuff \
do_stuff() \
}while(0);