'_WIN32_WINNT' / 'WINVER' :宏重定义

3

我有一个VS2015 C++项目,需要在Windows 7和XP上运行。因此,我想将_WIN32_WINNT和WINVER设置为_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 SDKs\Windows\v7.1A\include\SDKDDKVer.h(197): note: see previous definition of '_WIN32_WINNT'
1>stdafx.h(13): warning C4005: 'WINVER': macro redefinition
1>  C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\include\SDKDDKVer.h(212): note: see previous definition of 'WINVER'

你不需要直接定义#define _WIN32_WINNT - 只需将其删除即可。 - RbMm
未定义 CHICAGO请添加以下行 #define CHICAGO - RbMm
2
请查看targetver.h文件并按照指示操作。 - Hans Passant
2个回答

5

因为 #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>

2
有没有使用名称(例如_WIN32_WINNT_WINXP)而不是数值常量(例如0x0501)的解决方案? - Liviu
@Liviu - 你所需要的一切都在 <sdkddkver.h> 中。 - selbie
2
是的,但在包含<sdkddkver.h>之前,我必须定义“_WIN32_WINNT”,对吗?并接受警告“C4005:'_WIN32_WINNT':宏重定义”。 - Liviu

1

尝试

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

您需要包含以便使用_WIN32_WIN_WINXP。但是,您需要#undef _WIN32_WINNT,因为它在中定义。这样,当您使用#define _WIN32_WINNT _WIN32_WINNT_WINXP时,就不会收到_WIN32_WINNT重新定义的警告。

虽然这段代码可能解决了问题,但是包括解释它如何以及为什么解决了问题将有助于提高您的帖子质量,并可能导致更多的赞。请记住,您正在回答未来读者的问题,而不仅仅是现在提问的人。请[编辑]您的答案以添加解释并指出适用的限制和假设。 - Adrian Mole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接