[[已弃用]] 在 Visual Studio 中会导致错误而不是警告
[[deprecated]] results in error instead of warning in Visual Studio
根据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)
- 警告处理为错误这里有什么问题
- 隐式重新解释引用时强制转换,没有警告/错误
- 我在 C++ 代码中遇到错误警告:控制到达非空函数 [-Wreturn 类型] 的末尾
- 使用 reverse_iterator 而不是const_reverse_iterator并获得讨厌的编译器警告和错误
- GCC 警告和 gcc 错误消息之间的区别
- 在 eclipse 中,将宏重定义视为错误而不是警告
- 在 GCC 中启用"differing levels of indirection"警告/错误
- 当警告为错误时使用 [[已弃用]] 属性 (-Werror)
- G++ 编译器未为未定义的方法生成错误/警告
- 常量更改而不const_cast<> 为什么没有编译器警告/错误?
- 在制作过程结束时显示警告/错误的数量
- 钻石继承方案在 G++ 中编译良好,但在 VC++/Eclipse 中产生警告/错误
- 是否有任何方法可以避免警告/错误模板实例化回溯
- 如何捕获python警告错误并'bury'它?
- OSX:ld:警告:错误符号操作:适用于核心库
- Visual Studio的C4345警告错误吗?
- Visual Studio 上的 CRT SECURE 警告/错误是怎么回事?
- 禁用单个警告错误
- 如何在MSVC中为传递给变分函数的非POD参数启用警告/错误
- 警告错误问题