为什么两个相同的 VS2015 项目之一会产生错误 C4995?

Why does one of two identical VS2015 projects produce error C4995?

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

我在文件中有这段代码 "xie.cpp":

#include "stdafx.h"

void s()
{
     XInputEnable(TRUE);
}

这里是stdafx.h:

#pragma once

#include <windows.h>
#include <Xinput.h>

当我编译 xie.cpp 时,我得到这个错误信息:

xie.cpp(5): error C4995: 'XInputEnable': name was marked as #pragma deprecated

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

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

任何人都可以为我建议进一步的调查吗?

更新

问题是我不理解预编译的 headers 以及我想要的。当我将目标平台版本从 8.1 更改为 10.0.14393.0,然后重建项目时,Xinput.h header 来自 Windows 10 套件,而不是 Window 8.1成套工具。唯一的区别是 Windows 10 版本包括这些行:

#if(_WIN32_WINNT >= _WIN32_WINNT_WIN10)
#pragma deprecated(XInputEnable)
#endif

_WIN32_WINNT 和 _WIN32_WINNT_WIN10 的值为 0x0A00,因此,实际上,XInputEnable 在此版本的 Xinput.h

中被标记为已弃用

有人知道为什么吗?

答案是 VS2015 不会将项目配置中目标平台的更改视为重新编译 headers 的理由。因此,即使平台更改可以将一组 headers 换成另一组,但在平台更改后,您仍将使用先前预编译的 headers,直到您明确强制重新编译它们。

这里的效果是掩盖了一个事实,即我的工作程序实际上与有错误的程序并不相同,因为工作程序仍在使用旧的 headers(其中 XInputEnable 未标记为已弃用),尽管我的配置和我自己编写的源文件在这两个项目中都是相同的。

我想教训是,如果你改变目标平台,你应该立即重建。