2011-07-02 96 views
19

我知道如何禁用全部未知#pragma警告。答案是,例如,在這裏:SO: How to disable #pragma warnings?如何禁用特定的未知#pragma警告? (GCC和/或鐺)

我的問題是 - 有沒有辦法禁用一個特定的雜注「未知編譯指示」警告?例如,如果我禁用警告爲#pragma ugubugu下面的代碼:

#pragma ugubugu 
#pragma untiunti 
int main() {return 0;} 

當編譯之一:

g++ pragma.cpp -Wall 
clang++ pragma.cpp -Wall 

應該產生一個警告:

warning: ignoring #pragma untiunti 

也許,例如,有一種簡單的方法來註冊一個什麼也不做的定製編譯指示?

很高興知道Visual Studio是否有這樣的選項,但這並不重要。

謝謝!


「但爲什麼最終他玩定製編譯指示?」

我的源碼由兩個編譯器分析。在其中之一中,有一個特殊的#pragma,這是另一個未知的。當然,我可能會在#pragma的每個實例周圍放置#ifdef COMPILER_IDENTIFICATION_MACRO ... #endif,但這會很麻煩。

回答

13

我確信沒有任何辦法可以做到這一點。

GCC和鏘確實有內部接口允許語言前端與預處理註冊#pragma處理器 - 見GCC的libcpp/directives.c和鏘的lib/Lex/Pragma.cpp - 但是,據我所看到的,沒有什麼可以讓你修改的處理程序基於命令行選項進行註冊(超出您正在編譯的語言版本的含義)。

我知道如何禁用全部未知#pragma警告。答案例如在這裏:SO: How to disable #pragma warnings?

請注意,最高的投票答案比接受的答案好。 -Wno-unknown-pragmas可以簡單地添加在命令行任何東西(如-Wall)打開警告。

我的源碼由兩個編譯器分析。在其中之一中,有一個特殊的#pragma,這是另一個未知的。當然,我可能會在#pragma的每個實例周圍放置#ifdef COMPILER_IDENTIFICATION_MACRO ... #endif,但這會很麻煩。

從更哲學的角度來看,我認爲這確實是一個正確的解決方案,儘管它可能是麻煩的!

這似乎是正確的對我隱瞞預計不理解它,你打算的方式編譯器,任何#pragma考慮到的#pragma整點是提供在調用實現定義的行爲的機制編譯器。

(如果你最終做這個,注意鏘定義__clang__,但 GCC和Clang的定義__GNUC__

+0

鑑於沒有人提出更好的解決方案,我必須接受那個說「現在有辦法做到這一點」的人 - 那就是 - 你的。另外,如果我決定深入研究,那麼指向編譯器內部的指針可能會有所幫助。謝謝! – CygnusX1

+0

沒有人知道在代碼中抑制警告的方法嗎?當我提交它時,我會無法控制的自動化項目生成。它被建立完整的警告。 – Dan

+1

的#pragma GCC診斷推 的#pragma GCC診斷忽略「-Wunknown的編譯指示」 ...使用未知編譯指示代碼... 的#pragma GCC診斷推 – Dan

-2
  • 編譯器不允許自定義編譯指示,因爲編譯指示(主要是)編譯器和/或鏈接器控制指令。由於這與特定的編譯器實現和功能非常接近,因此爲用戶定義「新編譯指示」的應用程序是什麼?事實上,在特定的編譯器上實現的可用編譯指示是完全獨立於供應商的(沒有C++標準化規則)。
  • 您可能希望使用編譯指示來標記代碼的特殊部分(例如,餵給自己的預處理器),因爲您要求禁止運行指令。這可以使用預處理器(#defines)完成。
  • 在C/C++代碼中定製「標記」的另一種可能性,例如:#MY_PRAGMA是在C/C++之前使用您自己的預處理器。

這種類型的處理的例子用於QT庫,與Qt MOC編譯器交互的非標準Metaobject系統。這用於擴展一些非C++結構(例如Q_OBJECT,Q_PROPERTY等),後者將使用有效語法向C++編譯器提供。

+4

我不認爲他正在做一個什麼也不做的編外指令,而是他認爲這是一種可能的方式來消除警告。 'ugubugu'是一個未知的編譯指示,所以註冊它,但是它什麼也不做,所以現在它是一個已知的編譯指示,不會產生警告。 –

+0

@Dennis Zickefoose,但爲什麼最終他在玩自定義編譯?我懷疑他試圖在代碼中使用它們作爲'標記'或類似的東西,這是完全有效的,但是有替代方案,而不是使用自己的編譯指示(可能會與編譯器供應商產生衝突,因爲它們沒有標準化) –

1

我假設你要禁用編譯警告,因爲它的東西,是有效的一個平臺而不是另一個。如果是這種情況,可以使用宏來選擇性地啓用編譯指示,而不需要抑制警告。

例如,如果你想上的Visual C的編譯++而已,你可以這樣做:

#if defined(_MSC_VER) 
# define SAFE_PRAGMA_UGUBUGU __pragma(ugubugu) 
#else 
# define SAFE_PRAGMA_UGUBUGU 
#endif 

然後,你可以寫

SAFE_PRAGMA_UGUBUGU 
#pragma untiunti 
int main() {return 0;}