正在使用#pragma警告推/popup正确的方式来临时改变警告级别?

偶尔很难编写不会发出警告的C ++代码。 但启用警告不失为一个好主意。 所以通常需要禁用某些特定构造的警告,并使其在所有其他代码段中启用。

到目前为止,我已经看到了两种方法。

第一个是使用#pragma warning( push )#pragma warning( pop )

  #pragma warning( push ) #pragma warning( disable: ThatWarning ) //code with ThatWarning here #pragma warning( pop ) 

第二个是使用#pragma warning( default )

  #pragma warning( disable: ThatWarning ) //code with ThatWarning here #pragma warning( default: ThatWarning ) 

我在第二个版本中看到的问题是,它放弃了最初的警告级别 – 在此之前警告可能已经closures,或者它的警告级别可能已经被改变。 使用default会放弃这些改变。

第一种方法看起来很干净。 有没有问题呢? 有没有更好的方法来实现?

第一种方法是最好的办法,国际海事组织。 我知道没有问题。

只要记住#pragma是编译器特定的,所以不要指望它在每个编译器上工作:)

对于所有的谷歌玩家来说,太迟了,

 #pragma warning ( suppress: ThatWarning ) // one single line with ThatWarning 

(通常是从VS 2008开始的 ,但是在VS 2005中仅用于代码分析器警告):

 #pragma warning ( push ) #pragma warning ( disable: ThatWarning ) // one single line with ThatWarning #pragma warning ( pop ) 

正确的做法(虽然有点难看)

 #ifdef _MSC_VER #pragma warning( push ) #pragma warning( once: ThatWarning ) #endif //code with ThatWarning here #ifdef _MSC_VER #pragma warning( pop ) #endif 

您可以禁用项目或文件选项中的特定警告,并且此设置适用于相关范围内的#pragmas的“默认”。 如果使用/W4 ,VS2005中的一些警告是无用的/恼人的,这会清除输出相当多的。

这是在configuration属性 – > C / C ++ – >高级下的属性。

我对第一个变体没有任何问题。 可能更好的方法是使用以下内容:

  #pragma warning( push ) #pragma warning( once: ThatWarning ) //code with ThatWarning here #pragma warning( pop ) 

这会让你知道代码中还有警告,但是警告信息不会太麻烦。 但这是品味的问题。