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

C 宏内部的未初始化变量警告不正确,c,macros,warnings,C,Macros,Warnings,我的代码中使用了一个宏,它包装函数调用并检查返回代码。宏非常简单: #define CALL_POP(FUNC) \ do \ { \ my_errno = FUNC;

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

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

有人知道为什么它会抱怨我在这里的用法吗?

我相信你遗漏了一些转义,在宏名称后转义换行

差不多

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

如何使用这个宏?(MCVE?)作为尤金尼什。他说,看看如何使用该宏来查看
FUNC
将是什么会很有用。我在问题中添加了一个用法示例。我正在努力得到一个削减MCVE,我可以很容易地张贴。如果上面的例子不够有用,我可以继续努力。我的错误是如何定义的?顺便说一句,你是说这是一个例子的呼吁。这是它唯一的叫法吗?还有其他方法吗?对不起,我是想加上那个部分。再次澄清。在“\”转义字符后有一个换行符,此代码格式设置内容是oddHm。什么这里一切都很好。