Visual studio 2015 为什么两个相同的VS2015项目中的一个会产生错误C4995?

Visual studio 2015 为什么两个相同的VS2015项目中的一个会产生错误C4995?,visual-studio-2015,deprecated,Visual Studio 2015,Deprecated,我正在使用Windows 10下的Visual Studio 2015社区 我在文件“xie.cpp”中有此代码: #包括“stdafx.h” void s() { XInputEnable(真); } 下面是stdafx.h: #pragma一次 #包括 #包括 编译xie.cpp时,我收到以下错误消息: xie.cpp(5):错误C4995:“XInputEnable”:名称被标记为#pragma已弃用 由于我发现这相当令人费解,我复制了项目树,在vcxproj文件的名称后面添加了一个“

我正在使用Windows 10下的Visual Studio 2015社区

我在文件“xie.cpp”中有此代码:

#包括“stdafx.h”
void s()
{
XInputEnable(真);
}
下面是stdafx.h:

#pragma一次
#包括
#包括
编译xie.cpp时,我收到以下错误消息:

xie.cpp(5):错误C4995:“XInputEnable”:名称被标记为#pragma已弃用

由于我发现这相当令人费解,我复制了项目树,在vcxproj文件的名称后面添加了一个“2”,并将副本添加到解决方案中。在重复的项目中编译xie.cpp时,没有收到错误消息

我已经检查了这两个项目的所有项目配置设置。它们是理想的。我删除了x64子树,其中重新编译了编译的对象文件。无论我做什么,原始项目编译时都会出现错误,而复制的项目编译成功。我想我可以继续复制项目,但我确实想知道为什么我会收到那个错误消息

有人能为我建议进一步的调查吗

更新

问题是我并不像我想的那个样理解预编译头。当我将目标平台版本从8.1更改为10.0.14393.0,然后重建项目时,Xinput.h头来自Windows 10工具包,而不是Windows 8.1工具包。唯一的区别是Windows 10版本包括以下几行:

#if(_WIN32_WINNT>=_WIN32_WINNT_WIN10)
#pragma已弃用(XInputEnable)
#恩迪夫
_WIN32_WINNT和_WIN32_WINNT_WIN10的值均为0x0A00,因此在此版本的Xinput.h中,XInputEnable被标记为已弃用


有人知道为什么吗?

答案是VS2015不把项目配置中目标平台的更改作为重新编译头的理由。因此,即使平台更改可以将一组头交换为另一组头,但在平台更改后,您仍将使用以前预编译的头,直到强制显式重新编译它们

这里的效果是掩盖了这样一个事实,即我的工作程序实际上与有缺陷的程序不完全相同,因为工作程序仍然使用旧的头文件(其中XInputEnable没有标记为不推荐),尽管我自己编写的配置和源文件在这两个项目中都是相同的


我想教训是,如果您更改了目标平台,您应该立即进行重建。

右键单击项目中产生警告的函数名称,然后选择“转到定义”。您将在函数声明下面看到弃用。Microsoft希望您停止使用该功能。是否看到警告取决于所针对的SDK以及使用_WIN32_WINNT宏所针对的Windows版本。他们想让你这么做的确切原因还不清楚,MSDN的文章没有详细说明。谢谢@Hans,这会让我比我自己的fiddling来得更快。事实上,VS找到了这两个平台的版本,很明显W10文件将其标记为已弃用,而W8.1文件则没有。我猜在使用其他XInput函数之前,您不再需要调用它。是的,当我为10.0.14393.0平台编译和链接时,只需将调用留给XInputEnable out,我正在使用的其他XInput函数仍然可以工作。在网上文档中写一句话就好了。有人知道为什么吗?因为0x0A00>=0x0A00,所以
(\u WIN32\u WINNT>=WIN32\u WINNT\u WIN10)
为真?:-)为什么XInputEnable被弃用?(当然,你知道我是这么问的;)