2009-02-17 29 views
30

msdn我得到這個:C#:是否需要編譯指示警告還原?

#pragma warning disable warning-list 
#pragma warning restore warning-list 

在這些例子中,無論是disablerestore使用。是否需要restore,如果我希望禁用整個文件?

像,如果我不恢復,它有多遠?對於之後編譯的所有內容,警告是否被禁用?或者只是爲該文件的其餘部分?還是忽略?

回答

35

如果您未恢復,則對文件的其餘部分禁用處於活動狀態。

有趣的是,這個行爲是而不是定義在language specification。 (參見9.5.8)上。然而條件編譯符號的9.5.1節並指示該「直到文件行爲結束」

符號保持定義直到該相同符號 #undef指令被處理,或者直到到達 源文件的末尾。

鑑於「預處理器」實際上是編譯的詞法分析階段的一部分,它是可能的這種行爲是對微軟和所有其他類型的可預見的未來(特別是因爲替代將是一個有效的合同基於源文件編譯順序非常複雜和不確定)

+1

總結:沒有定義行爲,所以我們需要恢復 – Julian 2015-05-18 11:30:24

2

不,您會發現編譯器會在解析源文件完成後自動恢復任何禁用的警告。

#pragma warning disable 649 
struct MyInteropThing 
{ 
    int a; 
    int b; 
} 
#pragma warning restore 649 

在上面的例子中,我轉而警告CS00649,因爲我打算以不安全的方式使用這個結構。編譯器不會意識到我將寫入具有這種佈局的內存,所以我想忽略該警告:

字段'字段'永遠不會被分配到,並且將始終具有其默認值'值'

但我不想讓整個文件不被選中。

+0

如果警告已被命令行參數禁用,該怎麼辦?你將最終恢復你不應該。 – drowa 2016-10-27 20:29:28

+0

@drowa然後是假設你不需要首先禁用。據我所知,在C#編譯器中沒有什麼等同於C++ push/pop。所以它沒有比這更好。 – 2016-10-28 11:43:46

3

假設我有一個使用反射初始化的私有字段,編譯器顯然找不到任何直接寫入此字段的代碼,因此它會顯示警告 - 我不想展示。

我們還要說,如果我禁用整個文件的警告,這將不會觸發警告,我還有另一個私人字段定義了第一行下面三行,我忘記了初始化。

因此,#pragma警告的最佳用法是在引起警告的行之前放置一個「警告禁用」,以防止警告並在行後緊跟一個「警告還原」,以便在文件中的不同位置仍然會觸發警告。