54

msdn我得到这个:

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

在示例中,都使用了disablerestorerestore如果我希望对整个文件禁用它,是否有必要?

就像,如果我不恢复,它会走多远?之后编译的所有内容是否都禁用了警告?还是只针对该文件的其余部分?还是被忽略了?

4

3 回答 3

59

如果您不恢复,则禁用对文件的其余部分处于活动状态。

有趣的是,语言规范中没有定义这种行为。(请参阅第 9.5.8 节)但是,关于条件编译符号的 9.5.1 部分确实表明了这种“直到文件行为结束”

该符号保持定义,直到处理相同符号的#undef 指令,或者直到到达源文件的末尾。

鉴于“预处理器”实际上是编译的词法分析阶段的一部分,在可预见的未来,这种行为很可能是微软和所有其他实现的有效合同(特别是因为替代方案将非常复杂且基于非确定性关于源文件编译顺序)

于 2009-02-17T13:28:26.690 回答
3

假设我有一个使用反射初始化的私有字段,编译器显然找不到任何直接写入该字段的代码,因此它会显示一个警告 - 我不想显示。

假设我在我忘记初始化的第一行下方定义了另一个私有字段,如果我禁用整个文件的警告,则不会触发警告。

因此,#pragma 警告的最佳用法是在导致我要抑制的警告的行之前放置一个“警告禁用”,并在该行之后放置一个“警告恢复”,以便在不同位置的相同条件文件仍然会触发警告。

于 2009-02-17T13:32:26.990 回答
2

不,您会发现编译器在完成对源文件的解析后会自动恢复任何禁用的警告。

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

在上面的示例中,我已关闭警告 CS00649,因为我打算以不安全的方式使用此结构。编译器不会意识到我将写入具有这种布局的内存,所以我想忽略警告:

字段“字段”从未分配给,并且始终具有其默认值“值”

但我不希望整个文件不被选中。

于 2009-02-17T13:28:26.003 回答