[[deprecated]]
void foo(){};
int main()
{
foo();
}
上面的代码在VS2017中产生以下错误:
1>------ Build started: Project: test, Configuration: Debug Win32 ------
1>deprecation.cpp
1>d:\source\deprecation.cpp(6): error C4996: 'foo': was declared deprecated
1>d:\source\deprecation.cpp(2): note: see declaration of 'foo'
1>Done building project "test.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
不幸的是,搜索此错误会导致“如何使用[[deprecated]]”和“不赞成使用哪些功能”的问题。样式问题。
我检查的所有资源似乎都建议使用[[deprecated]]应该和上面写的一样简单-预期会出现编译器错误/警告,但不是编译失败。注释掉[[deprecated]]行可成功构建。
项目的目标是Windows SDK版本10.0.17763.0。
cl.exe版本是19.16.27027。
我在使用[[deprecated]]时错过了明显的事情吗,还是VS2017正在寻找一种打破它的方法?
答案 0 :(得分:6)
由于启用了“ SDL检查”,因此出现错误而不是警告。它看起来像在VS17中默认启用的SDL。来自doc:
/ sdl 启用这些警告为错误:
C4146 / we4146一元减号运算符应用于无符号类型, 导致未签名的结果。
C4308 / we4308负整数常数转换为无符号 类型,可能会导致毫无意义的结果。
C4532 / we4532在__finally中使用continue,break或goto关键字 / finally块在异常终止期间具有不确定的行为。
C4533 / we4533初始化变量的代码将不会执行。
C4700 / we4700使用未初始化的局部变量。
C4703 / we4703使用可能未初始化的本地指针 变量。
C4789 / we4789特定C运行时缓冲区溢出-时间(CRT) 函数。
C4995 / we4995已弃用标有pragma的功能。
C4996 / we4996使用标记为已弃用的功能。
要解决此问题,请转到“属性”->“ C / C ++”->“ SDL检查”,将其设置为“否(/ sdl-)”。之后,您将获得
: warning C4996: 'foo': was declared deprecated
: note: see declaration of 'foo'