如何优雅地克服无意义的C++编译器警告?

sha*_*oth 27 c++ compiler-construction compiler-warnings

这个问题不受任何特定编译器警告的约束,以下只是一个例子.

目前我想要一个检查内部退出条件的循环:

 while( true ) {
    doSomething();
    if( condition() ) {
       break;
    }
    doSomethingElse();
}
Run Code Online (Sandbox Code Playgroud)

我不能在Visual C++中编写它 - 它会发出C4127 conditional expression is constant警告.编译器会在我脸上挥动它,虽然很明显它while(true)不能被意外地写出来.

假设我想要编译而没有警告的代码.我的服务有各种解决方法.

解决方法是使用for(;;)但感觉很愚蠢 - 为什么我想要那个奇怪的东西而不是简洁优雅的惯用语while(true)解决方法二是在行#pragma warning( suppress)之前使用,while( true )但它添加了一个巨大的横幅,它是while-statement本身的两倍.解决方法三是为整个项目禁用C4127(我已经看到它在一个真实项目中完成)但是所有可能的C4127实例也被禁用.

是否有任何优雅的方法来摆脱毫无意义的警告?

Che*_*Alf 28

我写的for(;;)是因为那是惯用的.

较新版本的Visual C++并不像早期版本那样白痴.警告.Visual C++ 10.0编译<windows.h>在警告级别4 使用没有警告的代码.

但是如果你想关闭Visual C++傻瓜警告,请看看我的旧反傻警告标题,它是使用[comp.lang.c ++]社区的输入创建的.

  • 我喜欢反傻警告标题,虽然其中一些看起来不那么愚蠢...... (4认同)
  • windows.h编译时没有警告,因为里面塞满了`#pragma warning(disable)`. (3认同)

Mar*_*ers 11

for(;;)即使没有那个警告,我也会去.这不是愚蠢的:它是一个没有条件的循环,这正是你想表达的.

对我而言,这似乎比使用while循环更合乎逻辑,并且每次循环测试都是真的(当然编译器会优化掉这个测试,所以它实际上不会影响性能).

  • -1因为它只解决OP给出的*示例*而不是关于处理所有*无意义*警告的策略的实际问题 (4认同)
  • @Will实际上问题是**one*编译器中的*one*warning(C4127).Upvoting. (2认同)
  • @Will我可以阅读,谢谢,包括你没有引用的部分. (2认同)

Mar*_* Ba 6

可能 - 实际可实现 - 优雅的一行:

 #pragma warning ( suppress : 4127 )
Run Code Online (Sandbox Code Playgroud)

(我不能使用它,因为我仍然在VS2005上,这对所有警告都不起作用.)

当然,对于你的情况for(;;)可能是务实的方法,但总的来说

如何优雅地克服无意义的 C++编译器警告?

我会说禁用他们的 项目.(毕竟没有意义).并且,变化

如何优雅地克服假阳性 C++编译器警告?

我会说,单个预处理器行似乎已经很好了.