从msdn我得到了这个:
#pragma warning disable warning-list
#pragma warning restore warning-list
在示例中,使用了disable
和restore
。如果我想要为整个文件禁用它,是否需要restore
?
就像,如果我不恢复,它携带多远?之后编译的所有内容都禁用警告吗?或者仅仅是该文件的其余部分?还是被忽略了?
答案 0 :(得分:44)
如果您没有恢复,则对文件的其余部分禁用禁用。
有趣的是,此行为在language specification中定义为 。 (参见第9.5.8节)但是条件编译符号的9.5.1部分确实表明“直到文件结束行为”
符号保持定义直到a 处理相同符号的#undef指令,或直到结束 到达源文件。
鉴于'预处理器'实际上是编译词汇分析阶段的一部分,在可预见的未来,这种行为很可能是微软和所有其他实现的有效合同(特别是因为替代方案非常复杂,基于源文件编译顺序的非确定性)
答案 1 :(得分:3)
假设我有一个使用反射初始化的私有字段,编译器显然找不到直接写入此字段的任何代码,因此它会显示警告 - 我不想显示。
我们还说我有另一个私有字段,在我忘记初始化的第一行下面定义了3行,如果我禁用整个文件的警告,则不会触发警告。
因此,#pragma警告的最佳用法是在导致我要抑制的警告的行之前放置“警告禁用”,并在行之后放置“警告恢复”,以便在不同的情况下使用相同的条件文件中的位置仍会触发警告。
答案 2 :(得分:2)
不,您会发现编译器在解析完源文件后会自动恢复任何已禁用的警告。
#pragma warning disable 649
struct MyInteropThing
{
int a;
int b;
}
#pragma warning restore 649
在上面的例子中,我转向警告CS00649,因为我打算以不安全的方式使用这个结构。编译器不会意识到我将写入具有这种布局的内存,所以我想忽略警告:
字段“字段”永远不会分配给,并且始终具有默认值“值”
但我不希望整个文件不被取消选中。