[[已弃用]] 在 Visual Studio 中会导致错误而不是警告

[[deprecated]] results in error instead of warning in Visual Studio

本文关键字:警告 错误 Studio Visual      更新时间:2023-10-16

根据cpp首选项[[deprecated("message string")]]我们应该能够使用该符号,但在VS中会导致错误。

例如,我不想为 UNICODE 构建中的 ANSI 方法发出警告,反之亦然:

#ifdef UNICODE
[[deprecated("This method does not work well in UNICODE builds")]]
#endif // UNICODE
void f() {}

编译器不允许我编译,但标准说该属性应该允许使用,但发出警告消息。

如何解决这个问题?,顺便说一句,我的项目设置为与标准的最大一致性。

VS违反标准的原因是什么,有没有更好的方法来对上述情况发出警告?

派对很晚,但这花了我今天早上几个小时。

默认情况下,Visual Studio 和 sdl(安全开发生命周期(编译标志处理[[deprecated]]为错误。无论你是否同意这一点,他们就是这样做的。

要解决此问题,请转到Configuration Properties -> C/C++ -> Command Line并添加/sdl /w34996

/wX 部分表示警告的严重性,其余部分是要报告为警告的错误。

我希望这能为人们节省一些时间。

我能够通过添加

/w34996

到编译器选项,如以下链接中的响应中所建议的

https://developercommunity.visualstudio.com/content/problem/786502/cant-treat-deprecated-warning-as-warning-with-wx.html

没有更好的方法来对上述情况发出警告?

至少据我所知,除了标准C++中的弃用属性之外,没有其他方法可以警告函数的使用。

Msvc 还有其他替代方案,例如#pragma deprecated(f),但这些也不是更好。

如何解决这个问题?

假设您尚未将编译器配置为将警告视为错误,则可以继续向维护者编写错误报告。

我还没有用Visual Studio测试过它,但就我而言,以下内容有所帮助,并且可能更通用:

对于该错误,通常警告被视为编译器标志的错误-Werror,这是在 Visual Studio 中自动设置的。这就是标有[[deprecated]]的类或函数导致错误的原因。若要显式避免该错误并将其作为警告输出,可以设置编译器标志-Werror -Wno-error=deprecated-declarations。在CMake中,它看起来像:

add_compile_options(-Werror -Wno-error=deprecated-declarations)