在C ++中检查空for循环

时间:2016-05-05 09:08:26

标签: c++ templates macros

是否有可能在C ++中检查空for循环,也许是一些聪明的模板/宏技巧?好像GCC不支持-wempty-body for for循环。

3 个答案:

答案 0 :(得分:4)

查看静态代码分析工具及其选项。 CPPCheck与我使用的IDE捆绑在一起,在提交之前执行静态分析。

答案 1 :(得分:2)

你认为什么是空的for循环?此?

for(;;) {}

此?

for(;;);

这个怎么样?

for(int i = 0; i < 10; ++i);

所有这些表格都是合法的(;被视为空声明)。前两个等同于while(true),而最后一个定义i并将其递增10次。从历史上看,GCC并没有对此进行优化,因为for(;;);main()末尾的内核和其他嵌入式程序中的常见模式。

...然而

以下测试用例确实会产生警告(缩进很重要):

int main()
{
    for (; 1<2; );
    {
      if (1==1);
    }
    while (1==1);
      return 0;
}

main.cpp: In function 'int main()':

main.cpp:4:9: warning: this 'for' clause does not guard... [-Wmisleading-indentation]

         for (; 1<2; );
         ^~~

main.cpp:5:11: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the 'for'

           if (1==1);
           ^~

main.cpp:5:20: warning: suggest braces around empty body in an 'if' statement [-Wempty-body]

           if (1==1);
                    ^

main.cpp:6:9: warning: this 'while' clause does not guard... [-Wmisleading-indentation]

         while (1==1);
         ^~~~~

main.cpp:7:11: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the 'while'

           return 0;
           ^~~~~~

这意味着如果你担心一个散乱的分号并且你的代码正确缩进,你应该没事。

答案 2 :(得分:2)

除了learvst对静态分析工具的建议之外,还有一个额外的建议,如果你正在寻找这些空的for循环来追踪bug。

有许多空循环是完全正确的。例如:

for (auto it=v.begin(); it!=v.end() && *it!=val;  it++)
    ; 

但有一些令人讨厌的因;而难以发现

for (auto it=v.begin(); it!=v.end(); it++);    // oops !!! 
    do_something(*v); 

幸运的是,这些令人讨厌的错误通常与误导性缩进有关。因此,您可以使用GCC's 6 indentation警告-Wmisleading-indentation