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
声明吗?对不起,它的机密代码,所以我不能完全分享。
解决方案
该声明
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.
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)
语句现在成为隐藏宏的主体,if
这ENTER_FUNC()
可能不是预期的,而是一个错误。应用程序现在在某些情况下可能会出现错误。通过简单地查看源代码,这可能很难捕捉到。只有单步调试,再靠一点运气,才能发现错误。
(另一种选择是扩展所有宏并在替换后检查 C 代码。C 编译器通常提供仅预处理选项,使人眼可以看到预处理的结果。例如gcc -E
)
因此,作者ENTER_FUNC
构建了一个宏
- 如果正确使用宏,将导致编译器警告
- 如果宏使用错误,警告就会消失。
恕我直言,这是一个不太幸运的设计。
推荐阅读
- javascript - 从浏览器中的网络摄像头获取 ReadableStream
- c++ - 使用 SDL2 保存对象矢量
- android - 软键盘覆盖按钮
- laravel - Tenancy V1 如何在生产环境中创建新闻表
- sql - Hive:按属性将值聚合到 JSON 或 MAP 字段中
- javascript - 在 API 调用中过滤数据
- angular - 当数据相同时,Angular Subscription 不会触发两次
- razor - 是否可以使用剃须刀页面、非 MVC 仅直接剃须刀页面来更新引导进度条的百分比
- r - 根据另一列中的值重命名列中的特定行
- python - Qt Webengine不加载openstreetmap图块