【问题标题】:Treat C4596 as Warning将 C4596 视为警告
【发布时间】:2025-12-10 16:35:02
【问题描述】:

在 VS 2019 16.8.6 中使用编译器选项 /Wall,我得到一个 C4596

错误 C4596:“i”:成员声明中的限定名非法

对于以下测试程序:

struct S {
    int S::i;
};
int main() {}

Here's a godbolt.

  • 该错误适用于所有带有 /Wall 的 VS 2019 版本。
  • VS 2017 15.9.33 显示相同的行为。
  • VS 2015 不显示。
  • VS 2017 和 2019 甚至会在使用 /w 禁用所有警告时显示它,但是特别禁用 4596 确实会禁用它。

这是一个错误还是我做错/读错了什么?`

有没有办法将一些错误,尤其是这个错误视为警告(而不是相反)?

【问题讨论】:

    标签: c++ visual-c++ compiler-errors visual-studio-2019 compiler-warnings


    【解决方案1】:

    一种(有点奇怪)方法可以将此警告“重置”为“正常”模式(即将其视为错误);这涉及到使用#pragma warning(n:xxxx) 指令,如下所示:

    #pragma warning(4:4596)
    struct S {
        int S::i; // With that #pragma, this now generates 'just' a warning
    };
    

    警告 C4596:“i”:成员声明中的限定名非法

    不参与 MSVC 编译器的设计,我真的不能再详细说明为什么会发生这种情况。但是,有关使用 #pragma 指令调整其警告的更多信息,请参阅 here

    另外,可能有趣的是,clang-cl 编译器(在 Visual Studio 中使用)生成只是一个警告,有或没有那个 pragma:

    警告:成员“i”的额外资格 [-Wmicrosoft-extra-qualification]

    【讨论】:

    • 添加 #pragma 适用于我的 VS-2019(设置或不设置“一致性模式”)以及链接的 Compiler Explorer 示例。
    最近更新 更多