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

vkn*_*vkn 3 c++ deprecated cl.exe visual-studio-2017

[[deprecated]]
void foo(){};

int main()
{
    foo();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在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 ==========
Run Code Online (Sandbox Code Playgroud)

不幸的是,搜索此错误会导致“如何使用[[deprecated]]”和“不赞成使用哪些功能”的问题。样式问题。

我检查的每个资源似乎都建议使用[[deprecated]]应该和上面写的一样简单-预期会出现编译器错误/警告,但不是编译失败。注释掉[[deprecated]]行可成功构建。

项目的目标是Windows SDK版本10.0.17763.0。

cl.exe版本是19.16.27027。

我是否错过了使用[[deprecated]]的显而易见的东西,还是VS2017寻找打破它的方法?

Dmy*_*yka 7

您会收到一条错误警告,因为启用了“ SDL检查”。它看起来像在VS17中默认启用的SDL。从文档

/ sdl将这些警告作为错误启用

C4146 / we4146将一元减运算符应用于无符号类型,导致无符号结果。

C4308 / we4308负整数常数,转换为无符号类型,可能导致无意义的结果。

C4532 / we4532在异常终止期间,在__finally / finally块中使用continue,break或goto关键字具有未定义的行为。

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'
Run Code Online (Sandbox Code Playgroud)

  • @vkn,您检查过配置是否处于活动状态吗? (3认同)