簡體   English   中英

使用#pragma warning push/pop 是暫時改變警告級別的正確方法嗎?

[英]Is using #pragma warning push/pop the right way to temporarily alter warning level?

有時很難編寫完全不會發出警告的 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 )

我在第二個變體中看到的問題是它丟棄了原始警告級別 - 警告可能在此之前已關閉,或者其警告級別可能已更改。 使用default將丟棄這些更改。

第一種方法看起來很干凈。 它有什么問題嗎? 有沒有更好的方法來實現相同的目標?

這將適用於多個編譯器(以及不同版本的編譯器)。

標題“推”

#if defined(__clang__)
# pragma clang diagnostic push
#endif

#if defined(_MSC_VER)
# pragma warning(push)
#endif

#if defined(YOUR_FAVORITE_COMPILER)
# pragma your compiler push warning
#endif

標題“流行”

#if defined(__clang__)
# pragma clang diagnostic pop
#endif

#if defined(_MSC_VER)
# pragma warning(pop)
#endif

一些警告

#if defined(__clang__)
# pragma clang diagnostic ignored "-Wunused-parameter"
# pragma clang diagnostic ignored "-Wunused-variable"
#  if __has_warning("-Wnew-special-warning")
#   pragma clang diagnostic ignored "-Wnew-special-warning"
#  endif
#endif

#if defined(_MSC_VER)
# pragma warning(disable: 4100) // unreferenced formal parameter
# if _MSC_VER > _MSC_SOME_VERSION
#  pragma warning(disable: xxxx) // disable one more for special version
# endif
#endif

用法

// This code reports warnings
// ...
#include <ignore_compiler_warning/push>
#include <ignore_compiler_warning/warning_type_1>
#include <ignore_compiler_warning/warning_type_2>
#include <ignore_compiler_warning/warning_type_3>
// This code ignores warnings type_{1,2,3}
// ...
#include <ignore_compiler_warning/pop>
// Back to reporting warnings
// ...

此外,包括守衛可以檢查是否沒有雙重推送/彈出/禁用警告編譯指示。

更新

對於尖牙來說為時已晚,但對於所有的谷歌員工來說:

#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 )

第一種方法是最好的方法,IMO。 我知道它沒有問題。

請記住,#pragma 是特定於編譯器的,所以不要指望它適用於所有編譯器:)

正確的做法(雖然有點丑)

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

您可以禁用項目或文件選項中的特定警告,並且此設置適用於相關范圍內每個 #pragmas 的“默認”。 VS2005 中的一些警告是如此無用/煩人,以至於如果使用/W4 ,這會大大清理輸出。

這是在 Configuration Properties -> C/C++ -> Advanced 下的 Properties 中。

我對第一個變體沒有問題。 可能更好的方法是使用以下內容:

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

這會讓您知道代碼中仍然存在警告,但警告消息不會那么煩人。 但那是品味的問題。

第一種方法允許您在本地范圍內更改特定的警告設置。 它首先通過壓入堆棧存儲所有當前警告狀態,應用您的警告修改,然后恢復(彈出)到最后一個警告狀態。

#pragma warning( push ) #pragma warning( once: ThatWarning ) //這里使用ThatWarning 的代碼#pragma warning( pop )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM