"_WIN32_WINNT"/"WINVER":宏重新定义

'_WIN32_WINNT' / 'WINVER' : macro redefinition

本文关键字:新定义 定义 WIN32 WINNT WINVER      更新时间:2023-10-16

我有一个VS2015 C++项目.app必须在Windows 7和XP上运行。所以,我想将_WIN32_WINNTWINVER设置为_WIN32_WINNT_WINXP

这是我的项目stdafx.h的样子:

stdafx.h

#pragma once
#include "targetver.h"
#define _WIN32_WINNT        _WIN32_WINNT_WINXP         
#define WINVER              _WIN32_WINNT_WINXP   
#include <WinSDKVer.h>
// Windows Header Files:
#include <windows.h>

编译时,我看到以下警告/错误:

stdafx.h(12): error C2220: warning treated as error - no 'object' file generated
1>stdafx.h(12): warning C4005: '_WIN32_WINNT': macro redefinition
1>  C:Program Files (x86)Microsoft SDKsWindowsv7.1AincludeSDKDDKVer.h(197): note: see previous definition of '_WIN32_WINNT'
1>stdafx.h(13): warning C4005: 'WINVER': macro redefinition
1>  C:Program Files (x86)Microsoft SDKsWindowsv7.1AincludeSDKDDKVer.h(212): note: see previous definition of 'WINVER'

因为#include "targetver.h"包含<sdkddkver.h>,它已经定义了_WIN32_WINNT和 WINVER 的常量,而构建环境尚未定义它们。

事实上,自动生成的targetver.h会准确地告诉您如何解决此问题:

#pragma once
// Including SDKDDKVer.h defines the highest available Windows platform.
// 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.
#include <SDKDDKVer.h>

简单的解决方案。只需在包含targetver.h之前定义这些常量即可。您可能必须使用 XP 的实际文本值,因为您尚未包含定义

喜欢这个:

// x501 is XP
#define _WIN32_WINNT        0x0501         
#define WINVER              0x0501  
#include "targetver.h"
#include <windows.h>

尝试

#include <winsdkver.h>
#undef _WIN32_WINNT
#define _WIN32_WINNT _WIN32_WINNT_WINXP
#include <SDKDDKVer.h>

你 #include所以你可以使用_WIN32_WIN_WINXP。但是,您需要 #undef _WIN32_WINNT,因为它是在中定义的。 这样,当您使用 #define _WIN32_WINNT _WIN32_WINNT_WINXP 时,您就不会重新定义_WIN32_WINNT警告。