如何摆脱_WIN32_WINNT未定义的警告?

时间:2012-10-13 08:49:56

标签: c++ visual-c++

_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)

在编译期间,此错误不断弹出。它似乎不会影响编译,但我应该如何摆脱它?我是否会因忽视它而冒任何风险?

6 个答案:

答案 0 :(得分:16)

它是通过WinSDKVer.h为您定义的。因此,只需在源代码的顶部明确定义它(例如在stdafx.h的开头),就可以消除警告。

将它定义为相同的值(与WinSDKVer.h中的_WIN32_WINNT_MAXVER相比)极不可能破坏任何内容。

例如,用于Windows 7和.NET Framework 3.5 Service Pack 1的Windows®软件开发工具包(SDK)的WinSDKVer.h包含:

// This list contains the highest version constants supported by content 
// in the Windows SDK.

// [...]
#define _WIN32_WINNT_MAXVER     0x0601

答案 1 :(得分:16)

将其设置为您希望程序运行的最旧的Windows操作系统。 可能的值在此MSDN文章Using the Windows Headers中给出。

  

您可以在每个符号中使用#define语句来定义这些符号   源文件,或指定支持的/D编译器选项   Visual C ++。

     

例如,要在源文件中设置WINVER,请使用   以下声明:

 #define WINVER 0x0502    // Windows Server 2003 with SP1, Windows XP with SP2
     

要在源文件中设置_WIN32_WINNT,请使用以下语句:

#define _WIN32_WINNT 0x0502    // Windows Server 2003 with SP1, Windows XP with SP2
     

要使用_WIN32_WINNT编译器选项设置/D,请使用以下命令:

cl -c /D_WIN32_WINNT=0x0502 source.cpp

答案 2 :(得分:1)

注意:#define _WIN32_WINNT必须在 任何头文件之前发生,包括“stdafx.h”。

答案 3 :(得分:0)

在VS2019中解决

要解决这个问题,可以在我用来解决问题的user93353的超级答案中找到指向可能使用的值的链接。

https://stackoverflow.com/a/12871547/3070485

但是,在阅读解决方案之后,我在我的IDE(Visual Studio 2019)中设置了编译器选项。

对于任何想要在此处快速设置它并想要知道位置的人(由于这些特性在IDE发行版之间会发生变化,或者某个人可能更熟悉另一个IDE),就在这里。

enter image description here

配置属性
C / C ++
预处理器
预处理程序定义
_WIN32_WINNT = 0x0502

答案 4 :(得分:0)

#define _WIN32_WINNT#define WINVER 可以出现在标题中,只要它们出现在包括SDKDDKVer.h或Windows SDK中的任何标题(特别是{ {1}})。 Visual Studio VC ++项目通常提供一个Windows.h标头,您可以在其中包含targetver.h,定义WinSDKVer.h_WIN32_WINNTNTDDI_VERSION,然后包含{{1} }。该文件中的评论说:

WINVER

Microsoft文章Update WINVER and _WIN32_WINNT完全指导您在SDKDDKVer.h中定义// If you wish to build your application for a previous Windows platform, include `WinSDKVer.h` // and set the _WIN32_WINNT macro to the platform you wish to support before including `SDKDDKVer.h`. _WIN32_WINNT(尽管其中提到可以使用命令行来定义)参数)。

注意:WINVER被包含在Visual Studio生成的某些targetver.h资源文件中,因此这是如上所述填充targetver.h文件内容的另一个原因。 / p>

注意:在项目的构建配置中使用命令行参数或预处理程序指令来定义.rctargetver.h_WIN32_WINNT也是可以的,但都不能满足于包含{ {1}}和NTDDI_VERSION

注意:使用Windows 8.1 SDK(或更高版本)时,您可能还需要根据特定的Windows平台(服务器,台式机,电话,商店等)在WINVER中定义WinSDKVer.h。 ) 你需要。有关详细信息,请参见SDKDDKVer.h

注意:在较新的Windows SDK版本中,可以根据您为WINAPI_FAMILY定义的值来自动设置值targetver.hwinapifamily.hNTDDI_VERSION。但是,您可能想要在包含WINVER之前为_WIN32_IE定义一个更特定的版本。

答案 5 :(得分:0)

如果使用MFC :我的首选答案是包括windows.h。但是,如果您使用的是MFC,则无法执行此操作*。为了避免在项目中定义WINVER,可以在afx.h之前包含sdkddkver.h。

#include <sdkddkver.h>
#include <afx.h>

sdkddkver系统标头设置WINVER和_WIN32_WINNT,因此您无需将其添加到项目中。这与从系统标头对Windows SDK / DDK进行版本控制的windows.h一样。

*如果在afx.h之前包含windows.h,则会得到:#error: WINDOWS.H already included. MFC apps must not #include <Windows.h>