【问题标题】:Detecting semicolon after loop/if brackets在循环/如果括号后检测分号
【发布时间】:2013-06-12 04:46:59
【问题描述】:

GCC 中是否有任何标志(如 clang 中的 -Wempty-body),可以帮助我检测 while/for 循环大括号后的分号?有时人类很难发现这些简单的错误。

int i = 0;
for (i = 0; i < 10; ++i);
{
    cout << i << endl;
}

我使用 GCC 4.7.3 和 clang 3.2-1~exp9ubuntu1。

编辑: 我还检查了编译器是否可以帮助我在“if-else statements”之后找到这些错误。

if (i == 0)
{
    cout << i << endl;
}
else;
{
    cout << i << endl;
}

有趣的是 gcc 比 clang 更有帮助(使用此标志 (-Wall -pedantic -Wempty-body) 通过打印警告:

main.cpp:30:9: warning: suggest braces around empty body in an ‘else’ statement [-Wempty-body]

【问题讨论】:

  • 再想一想,这不是重复的,抱歉。但是,-Wempty-body 不也是 GCC 标志吗?
  • 在我看来,这似乎是一个很好的理由(即除了风格之外)将开始 {if/for/while 等放在同一行并拥有同一行也有单行。
  • 我在进行全面研究之前就开始写答案,但似乎“像 -Wempty-body in clang”这样的说法有点误导。我的 g++ (4.6.3) 或 clang++ (2.9) 版本在使用 -Wempty-body 时都没有发出警告。
  • 显然有太多误报,人们开始争论如何让评论或宏的存在(扩展为无)抑制警告,那时整个想法就被废弃了。 gcc.gnu.org/ml/gcc-patches/2008-11/msg00361.html

标签: c++ c gcc compiler-construction clang


【解决方案1】:

试试

$gcc -Wempty-body foo.c

gcc -Wextra -c foo.c

【讨论】:

  • 这对 gcc/g++ 4.7.2 不起作用(或者至少在我的计算机上不起作用)
【解决方案2】:

这里明显的答案是“用 clang++ 编译你的代码”(虽然我的 x86-64 的 2.9 版本似乎没有发现这个特殊问题,就像 gcc 4.6.3 没有发现它一样 - 所以我不完全相信问题的原始前提是有效的)。

此特定代码可以通过使用表单来避免此问题,方法是在 for-loop 本身之后给出使用 i 的错误:

for(int i = ...) 

而不是

int i;
for(i = ...)

当然,如果您希望 i 在循环后有一个值,那是行不通的。

[是的,这是一个非常烦人的错误——有时我花了好几个小时盯着屏幕才发现这种错误——其他时候你会立即发现它!]

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 2011-10-10
    • 2013-01-01
    • 2012-11-26
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多