[[不建议使用]]在VS2017中导致构建失败(错误C4996)

时间:2019-03-05 16:28:56

标签: c++ visual-studio-2017 deprecated cl.exe

[[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正在寻找一种打破它的方法?

1 个答案:

答案 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'