如何解决警告问题?

时间:2018-05-10 09:42:00

标签: c

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

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声明吗? 对不起,它的机密代码,所以我不能完全分享。

1 个答案:

答案 0 :(得分:2)

声明

if (cond) ; else do_something();

甚至

if (cond) ; do_something();

可能是有意的。可能是;之后的if (cond)是一个占位符,可以在以后添加。

插入评论

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

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

会让人类读者清楚,但不会完全忽略评论的编译器。

然而,编译器作者怀疑分号是否被无意识地设置(很容易被忽略)。因此,他们对此进行了警告,并提示如何在有一个目的时明确意图:

使用{ }而不是;用于清空当时的身体以发现此警告。

样品:

#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的技术更值得怀疑 - 我不建议这样做。想象一下以下情况:

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

if(something)语句现在成为if宏的隐藏ENTER_FUNC()的主体,这可能不是故意的,而是一个错误。在某些情况下,应用程序现在可能会出错。通过简单地查看源代码,这可能很难理解。只有通过单步调试和运气好,才能找到错误。

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

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

    如果正确使用宏,
  • 会导致编译器警告
  • 如果使用错误,警告就会消失。
恕我直言,这是一个不那么幸运的设计。