2009-06-08 75 views
79

與此MSVC預處理器代碼最接近的GCC相當於什麼?僅針對部分翻譯單元選擇性禁用GCC警告?

#pragma warning(push)     // Save the current warning state. 
#pragma warning(disable : 4723)   // C4723: potential divide by 0 
// Code which would generate warning 4723. 
#pragma warning(pop)      // Restore warnings to previous state. 

我們在通常包含的標題中有代碼,我們不想生成特定的警告。但是,我們希望包含這些頭文件的文件能夠繼續生成該警告(如果項目啓用了該警告)。

+0

如果安裝了頭到/ usr/include中或你有什麼GCC默認情況下不產生這些警告。 – Spudd86 2010-06-15 15:29:24

回答

86

這是possible in GCC自4.6版本,或周圍2010年6月在樹幹上。

下面是一個例子:

#pragma GCC diagnostic error "-Wuninitialized" 
    foo(a);   /* error is given for this one */ 
#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wuninitialized" 
    foo(b);   /* no diagnostic for this one */ 
#pragma GCC diagnostic pop 
    foo(c);   /* error is given for this one */ 
#pragma GCC diagnostic pop 
    foo(d);   /* depends on command line options */ 
34

最接近的事是GCC diagnostic pragma#pragma GCC diagnostic [warning|error|ignored] "-Wwhatever"。它不是非常接近你想要的,看到鏈接的細節和注意事項。

+1

您是否知道未添加此功能的理由是什麼? (我找不到它)。我發現警告push-disable-pop很有用。 – 2009-11-17 17:36:38

+1

我並不認爲gcc的「不添加功能」傾向於有一個理由,因爲沒有任何人提交工作補丁。 – chaos 2009-11-18 14:45:15

+13

這並不是說沒有人願意做的工作對這種在GCC細粒度預警控制,或提交代碼 - 我知道一個主要的硅谷公司已經這樣做的,而另一種本來很高興支付有人要做,並將代碼加入流中。相反,通過與作爲gdb維護者之一的人員的討論,gcc維護者有一個理念:「如果有警告,那是一個錯誤,你需要修復它。」所以(imo)這是一個宗教論證,他們控制代碼以贏得勝利。 – 2010-01-22 01:26:31

31

我已經做了類似的事情。對於第三方代碼,我根本不想看到任何警告。所以,而不是指定-I/path/to/libfoo/include,我用-isystem /path/to/libfoo/include。這使得編譯器將這些頭文件視爲「系統頭文件」以達到警告的目的,只要您不啓用-Wsystem-headers,那麼您就基本安全了。我仍然看到一些警告泄漏出去,但它減少了大部分垃圾。

請注意,這個只有可以幫助你,如果你可以通過include-directory來隔離有問題的代碼。如果它只是你自己項目的一個子集,或者與其他代碼混合在一起,那麼你的運氣不好。