我正在尝试解决警告问题,如下所示:
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
声明吗?
对不起,它的机密代码,所以我不能完全分享。
答案 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.
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
的作者构建了一个宏