如何摆脱 _WIN32_WINNT 未定义警告?
Posted
技术标签:
【中文标题】如何摆脱 _WIN32_WINNT 未定义警告?【英文标题】:How to get rid of _WIN32_WINNT not defined warning? 【发布时间】:2012-10-13 08:49:56 【问题描述】:_WIN32_WINNT not defined. Defaulting to _WIN32_WINNT_MAXVER (see WinSDKVer.h)
在我的编译过程中不断弹出这个错误。它似乎不影响编译,但我应该如何摆脱它?我是否会因为忽略它而冒任何风险?
【问题讨论】:
【参考方案1】:将其设置为您希望程序在其上运行的最旧的 Windows 操作系统。 可能的值在这篇 MSDN 文章中给出,Using the Windows Headers。
您可以在每个符号中使用
#define
语句来定义这些符号 源文件,或通过指定支持的/D
编译器选项 视觉 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
要使用
/D
编译器选项设置_WIN32_WINNT
,请使用以下命令:cl -c /D_WIN32_WINNT=0x0502 source.cpp
【讨论】:
【参考方案2】:它是通过 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
【讨论】:
我建议几乎一开始就将它添加到 StdAfx.h。这是每个操作系统的值列表。 msdn.microsoft.com/en-us/library/aa383745%28VS.85%29.aspxWIN32_WINNT
默认通过sdkddkver.h
定义,而WinSDKVer.h
定义_WIN32_WINNT_MAXVER
和相关的MAXVER
宏(通常设置为该版本支持的最新Windows 版本) Windows SDK)。将 _WIN32_WINNT
定义为有效值将解决 User982367637 询问的警告。该值应该是 _WIN32_WINNT_MAXVER
还是旧版 Windows 取决于他们是否希望他们的应用能够在旧版 Windows 上运行(如下面 user93353 的回答所述)。【参考方案3】:
在 VS2019 中求解
可以在 user93353 的超级答案中找到解决此问题的方法以及可能使用的值的链接。
https://***.com/a/12871547/3070485
但是,在阅读解决方案后,我在我的 IDE 中设置了我的编译器选项,即 Visual Studio 2019。
对于任何想要快速设置它并想知道位置的人(因为这些东西随着 IDE 版本的不同而变化,或者可能有人更熟悉另一个 IDE),这里就是它的去处。
配置属性 C/C++ 预处理器 预处理器定义 _WIN32_WINNT=0x0502
【讨论】:
【参考方案4】:注意:#define _WIN32_WINNT
必须出现在之前任何头文件,包括“stdafx.h”。
【讨论】:
@Stonz2 我不知道... [A] OP 抱怨他收到“_WIN32_WINNT 未定义”错误。 [B] 我告诉他在哪里定义 _WIN32_WINNT 以摆脱错误(看看他在哪里问“我应该如何摆脱它?”)。 [C] 这对他没有帮助吗? 投反对票。请参阅下面的答案。【参考方案5】:如果使用 MFC:我的首选答案是包含 windows.h。但如果您使用的是 MFC,则不能这样做*。为了避免在您的项目中定义 WINVER,您可以在 afx.h 之前包含 sdkddkver.h。
#include <sdkddkver.h>
#include <afx.h>
sdkddkver 系统标头设置了 WINVER 和 _WIN32_WINNT,因此您无需将其添加到您的项目中。这与 windows.h 相同,用于从系统标头对 windows SDK/DDK 进行版本控制。
*如果你在 afx.h 之前包含 windows.h,你会得到:#error: WINDOWS.H already included. MFC apps must not #include <Windows.h>
【讨论】:
【参考方案6】:#define _WIN32_WINNT
和 #define WINVER
可以出现在标头中,只要它们出现在包含 SDKDDKVer.h
或 Windows SDK 中的任何标头(尤其是 Windows.h
)之前。 Visual Studio VC++ 项目通常提供targetver.h
标头,您可以在其中包含WinSDKVer.h
,定义_WIN32_WINNT
、NTDDI_VERSION
和WINVER
,然后包含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`.
Microsoft 文章 Update WINVER and _WIN32_WINNT 竭尽全力指导您在 targetver.h
中定义 _WIN32_WINNT
和 WINVER
(尽管它提到这些也可以使用命令行参数定义)。
注意:targetver.h
包含在 Visual Studio 生成的某些 .rc
资源文件中,因此这是按照上文所述填写 targetver.h
文件内容的另一个原因。
注意:在项目的构建配置中使用命令行参数或预处理器指令定义 _WIN32_WINNT
、NTDDI_VERSION
和 WINVER
也可以工作,但两者都没有考虑包含 WinSDKVer.h
和 SDKDDKVer.h
的需要.
注意:在使用 Windows 8.1 SDK(或更新版本)时,您可能还需要在 targetver.h
中定义 WINAPI_FAMILY
,具体取决于您需要的特定 Windows 平台(服务器、桌面、手机、商店等)。详情请见winapifamily.h
。
注意:在较新的 Windows SDK 版本中,值 NTDDI_VERSION
、WINVER
和 _WIN32_IE
可以根据您为 _WIN32_WINNT
定义的值自动设置。但是,您可能希望在包含SDKDDKVer.h
之前为NTDDI_VERSION
明确定义一个更具体的版本。
【讨论】:
以上是关于如何摆脱 _WIN32_WINNT 未定义警告?的主要内容,如果未能解决你的问题,请参考以下文章