虽然这个答案是针对 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 工具集,在 Include 目录 和 Library Directories 中发现 SDK 库为 inherited_from VC++ 目录 部分,如 here 所述。
看起来警告是由于升级、迁移或工具集更改的组合而生成的。
编辑:VS2017 (MBCS) 中一个不相关的问题是选择使用
LoadCursorW(nullptr, IDC_ARROW)
而不是 WNDCLASSEXW 结构中的默认 LoadCursorA(...)。一个可能的解决方案是像这样重新定义:
#define IDC_ARROW MAKEINTRESOURCEW(32512)
这里可以通过在#define 之前使用#undef procedure 来抑制警告:
#ifdef IDC_ARROW
#undef IDC_ARROW
#endif
#define IDC_ARROW MAKEINTRESOURCEW(32512)