宏内部未初始化的变量警告不正确

时间:2017-06-27 14:38:54

标签: c macros warnings

我的代码中使用了一个宏来包装函数调用并检查返回代码。宏非常简单:

#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;

有没有人知道为什么抱怨我的用法?

1 个答案:

答案 0 :(得分:-2)

我相信你错过了一些转义,以便在宏名称之后逃脱换行符,

类似

#define CALL_POP(FUNC) \
do { \
// stuff \
do_stuff() \
}while(0);