首页 > 解决方案 > 如何解决警告问题?

问题描述

我正在尝试解决如下所示的警告问题:

warning: suggest braces around empty body in an 'if' statement

相关代码:

cdc(.....)
{
    //some statements
    ENTER_FUNC(CDC_TRKEY_FC,cdcType_t); //Showing warning in this line
    if(something)
    {
        if(..)
        {
        }
        else
        {
        }
    }
    else
    {
    }
}

如果我删除;并添加大括号如下

ENTER_FUNC(CDC_TRKEY_FC,cdcType_t)
{
}

警告消失了。

究竟是什么意思?它表现得像一个if声明吗?对不起,它的机密代码,所以我不能完全分享。

标签: c

解决方案


该声明

if (cond) ; else do_something();

甚至

if (cond) ; do_something();

可能是有意的。可能是,;afterif (cond)是稍后将添加的内容的占位符。

插入评论

if (cond) /** @todo */ ; else do_something();

或者

if (cond) /** @todo */ ; /* and then always */ do_something();

会让人类读者清楚,但对于完全忽略注释的编译器则不然。

但是,编译器作者怀疑分号被无意设置的可能性很大(并且很容易被忽略)。因此,他们对此进行了警告,并提示如何明确意图(如果有的话):

{ }改为使用;有意为空的 then-body 来解决此警告。

样本:

#include <stdio.h>

int main()
{
  int cond = 1;
  if (cond) /** @todo */ ; else printf("cond not met.\n");
  if (cond) /** @todo */ ; printf("cond checked.\n");
  return 0;
}

输出:

cond checked.

Life demo on ideone

ideone 上使用的编译器称为 gcc 6.3。

我必须承认我没有得到 OP 的诊断。


编辑问题后,答案似乎不再与问题匹配。因此,有一点更新:

OP指出,

warning: suggest braces around empty body in an 'if' statement

出现在这行代码中:

ENTER_FUNC(CDC_TRKEY_FC,cdcType_t); //Showing warning in this line

似乎 OP 不知道这ENTER_FUNC是(很可能)一个在其替换文本中带有if语句的宏(类似于#define ENTER_FUNC(A,B) if (...))。(这是获得此代码警告的最可想象的场景。)

不幸的是,OP 不愿意展示如何ENTER_FUNC定义,也不愿意准备具有相同行为的MCVE 。

然而,if在宏中隐藏 an 的技术更值得怀疑——我不建议这样做。想象以下情况:

cdc(.....)
{
    //some statements
    ENTER_FUNC(CDC_TRKEY_FC,cdcType_t) // This time, the author forgot the ; or {}
    if(something)
    {
        if(..)
        {
        }
        else
        {
        }
    }
    else
    {
    }
}

if(something)语句现在成为隐藏宏的主体,ifENTER_FUNC()可能不是预期的,而是一个错误。应用程序现在在某些情况下可能会出现错误。通过简单地查看源代码,这可能很难捕捉到。只有单步调试,再靠一点运气,才能发现错误。

(另一种选择是扩展所有宏并在替换后检查 C 代码。C 编译器通常提供仅预处理选项,使人眼可以看到预处理的结果。例如gcc -E

因此,作者ENTER_FUNC构建了一个宏

  • 如果正确使用宏,将导致编译器警告
  • 如果宏使用错误,警告就会消失。

恕我直言,这是一个不太幸运的设计。


推荐阅读