正在使用#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 )
这会让你知道代码中还有警告,但是警告信息不会太麻烦。 但这是品味的问题。