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

ida*_*hmu 4 c++ windows windows-xp visual-studio-2015

我有一个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>
Run Code Online (Sandbox Code Playgroud)

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

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'
Run Code Online (Sandbox Code Playgroud)

sel*_*bie 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>
Run Code Online (Sandbox Code Playgroud)

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

像这样:

// x501 is XP
#define _WIN32_WINNT        0x0501         
#define WINVER              0x0501  

#include "targetver.h"
#include <windows.h>
Run Code Online (Sandbox Code Playgroud)

  • 是否有使用 _WIN32_WINNT_WINXP 等名称而不是 0x0501 等数字常量的解决方案? (2认同)
  • 是的,但是我必须在包含`&lt;sdkddkver.h&gt;`之前定义`_WIN32_WINNT`,不是吗?并接受警告“C4005:'_WIN32_WINNT':宏重新定义” (2认同)