如何摆脱 _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.aspx WIN32_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 &lt;Windows.h&gt;

【讨论】:

【参考方案6】:

#define _WIN32_WINNT#define WINVER 可以出现在标头中,只要它们出现在包含 SDKDDKVer.h 或 Windows SDK 中的任何标头(尤其是 Windows.h)之前。 Visual Studio VC++ 项目通常提供targetver.h 标头,您可以在其中包含WinSDKVer.h,定义_WIN32_WINNTNTDDI_VERSIONWINVER,然后包含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_WINNTWINVER(尽管它提到这些也可以使用命令行参数定义)。

注意:targetver.h 包含在 Visual Studio 生成的某些 .rc 资源文件中,因此这是按照上文所述填写 targetver.h 文件内容的另一个原因。

注意:在项目的构建配置中使用命令行参数或预处理器指令定义 _WIN32_WINNTNTDDI_VERSIONWINVER 也可以工作,但两者都没有考虑包含 WinSDKVer.hSDKDDKVer.h 的需要.

注意:在使用 Windows 8.1 SDK(或更新版本)时,您可能还需要在 targetver.h 中定义 WINAPI_FAMILY,具体取决于您需要的特定 Windows 平台(服务器、桌面、手机、商店等)。详情请见winapifamily.h

注意:在较新的 Windows SDK 版本中,值 NTDDI_VERSIONWINVER_WIN32_IE 可以根据您为 _WIN32_WINNT 定义的值自动设置。但是,您可能希望在包含SDKDDKVer.h 之前为NTDDI_VERSION 明确定义一个更具体的版本。

【讨论】:

以上是关于如何摆脱 _WIN32_WINNT 未定义警告?的主要内容,如果未能解决你的问题,请参考以下文章

如何摆脱错误“_ms sql”未找到

tryenter临界区未声明的标识符

CMake 中的平台检测

摆脱 Julia 的“警告:为未更改的字符串重新定义常量”?

重温网络编程——常识

如何摆脱“未声明的选择器”警告