gpt4 book ai didi

c - 为什么编译器没有警告我空的 if 语句?

转载 作者:太空狗 更新时间:2023-10-29 16:24:02 24 4
gpt4 key购买 nike

我正在使用 Keil µVision v4.74 并启用了“所有警告”选项。

我编写了以下有意代码:

if(condition matched)
{
// Do something
}

当我重建我的项目时,我得到了 0 个错误,0 个警告。

然而,当我不小心写道:

if(condition matched);
{
// Do something
}

我也得到了 0 个错误,0 个警告。

我几乎不可能发现 if 条件后面的小 ; 是问题的根源。

为什么编译器不将其视为警告并通知我?

最佳答案

这不是错误,因为空语句有效的语句;然而,由于它肯定是可疑代码,因此它是编译器警告的完美候选者 - 事实上 gcc -Wall -Wextra 确实会对此发出警告:

int foo(int x) {
if(x); {
return 42;
}
return 64;
}

/tmp/gcc-explorer-compiler116427-37-l1vpg4/example.cpp: In function 'int foo(int)':
2 : warning: suggest braces around empty body in an 'if' statement [-Wempty-body]
if(x); {
^

https://godbolt.org/g/RG1o7t

两者都是ClangVisual C++也这样做。

GCC 6 甚至更聪明(好吧,也许太聪明了),甚至把缩进当作是错误的提示:

/tmp/gcc-explorer-compiler116427-76-1sfy0y/example.cpp: In function 'int foo(int)':
2 : warning: suggest braces around empty body in an 'if' statement [-Wempty-body]
if(x); {
^
2 : warning: this 'if' clause does not guard... [-Wmisleading-indentation]
if(x); {
^~
2 : note: ...this statement, but the latter is misleadingly indented as if it is guarded by the 'if'
if(x); {
^

因此,要么是您的警告不够充分,要么是您的编译器不够智能。

如果您没有可能切换到更有用的编译器,请考虑使用静态分析工具;例如,在这种情况下,cppcheck 会发现错误(当给定 --enable=all --inconclusive 标志时):

cppcheck --enable=all --inconclusive emptyif.c

输出:

Checking emptyif.c...
[emptyif.c:2]: (warning, inconclusive) Suspicious use of ; at the end of 'if' statement.
[emptyif.c:1]: (style) The function 'foo' is never used.

附录-各种编译器的相关警告(随时更新)

回顾一下,相关的警告选项是:

  • gcc -Wempty-body;包含在-Wextra;
  • gcc>=6.0,-Wmisleading-indentation 也有帮助;包含在-Wall;
  • Clang -Wempty-body;也包含在 -Wextra 中;
  • Visual C++ C4390 , 包含在 /W3

静态分析工具:

  • cppcheck --enable=warning --inconclusive;包含在 --enable=all --inconclusive

关于c - 为什么编译器没有警告我空的 if 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37482904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com