虽然这个答案是针对 VS10 的,但有趣的是,它可能会提供一些关于 VC++ 目录宏正在发生的事情的线索:当这些语句被添加到项目的头文件 MyApp 中时出现警告:
#ifndef NTDDI_WINXPSP3
#define NTDDI_WINXPSP3 0x05010300
#endif
#ifndef NTDDI_VISTA
#define NTDDI_VISTA 0x06000000
#endif
#ifndef NTDDI_VISTASP1
#define NTDDI_VISTASP1 0x06000100
#endif
#ifndef NTDDI_WS08
#define NTDDI_WS08 0x06000100
#endif
除 XPSP3 def. 外,其他所有人都会弹出如下警告:
警告 RC4005:“NTDDI_VISTASP1”:重新定义 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include\sdkddkver.h.., MyApp
MyApp 是 WinDebug 32 版本,注意到 Windows7.1SDK 出现在 proj 文件的 X64 部分:
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<PlatformToolset>Windows7.1SDK</PlatformToolset>
预处理器定义的继承值为 _VC80_UPGRADE=0x0600。在恢复到 V100 之前使用了 SDK 工具集后,SDK 库在VC++ 目录部分的Include 目录和Library Directories中被发现为inherit_from ,如此处所述。
看起来警告是由于升级、迁移或工具集更改的组合而生成的。
编辑:VS2017(MBCS)中的一个不相关问题选择使用
LoadCursorW(nullptr, IDC_ARROW)
LoadCursorA(...)
而不是WNDCLASSEXW 结构中的默认值。一个可能的解决方案是像这样重新定义:
#define IDC_ARROW MAKEINTRESOURCEW(32512)
在这里,可以通过使用之前的#undef
过程#define
来抑制警告:
#ifdef IDC_ARROW
#undef IDC_ARROW
#endif
#define IDC_ARROW MAKEINTRESOURCEW(32512)