如何解决ntstatus.h引发的宏重定义及_WIN32_WINNT重复定义警告?
解决UMDF_USING_NTSTATUS定义后重复编译警告的问题
问题描述
已添加UMDF_USING_NTSTATUS定义,但仍收到超100条编译警告,且头文件每被#include一次就重复出现相同警告。相关代码示例:
#ifndef UMDF_USING_NTSTATUS #define UMDF_USING_NTSTATUS #endif // !UMDF_USING_NTSTATUS #include <windows.h> #include <memoryapi.h> #include <ntsecapi.h> #include <ntstatus.h> #include <Sddl.h> class MyClass { protected: static NTSTATUS MyMethod(); };
收到的警告示例:
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\shared\SDKDDKVer.h(223): message : see previous definition of '_WIN32_WINNT' 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\shared\ntstatus.h(66,1): warning C4005: 'STATUS_WAIT_0': macro redefinition 1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(2549): message : see previous definition of 'STATUS_WAIT_0'
解决方法
1. 提前定义UMDF_USING_NTSTATUS至所有系统头文件之前
UMDF_USING_NTSTATUS的作用是告知Windows系统头文件(如windows.h)不要重复定义NTSTATUS相关宏。必须在任何系统头文件包含语句之前定义它,否则windows.h会先定义这些宏,后续ntstatus.h再定义就会触发重复警告。
修改后的头文件代码示例:
// 先定义UMDF_USING_NTSTATUS,确保在所有系统头文件之前 #define UMDF_USING_NTSTATUS // 再包含系统头文件 #include <ntstatus.h> #include <windows.h> #include <memoryapi.h> #include <ntsecapi.h> #include <Sddl.h> // 头文件保护避免重复包含 #pragma once class MyClass { protected: static NTSTATUS MyMethod(); };
如果多个编译单元都需要这个定义,更稳妥的方式是在项目层面添加:
- 在Visual Studio中,进入项目属性 -> C/C++ -> 预处理器 -> 预处理器定义,添加
UMDF_USING_NTSTATUS,这样整个项目的所有编译单元都会在编译前自动定义该宏,避免局部代码顺序错误。
2. 统一_WIN32_WINNT版本定义
警告中的_WIN32_WINNT重复定义,是因为不同系统头文件可能默认定义了不同版本的Windows目标系统。解决方式是在项目属性中统一指定该宏:
- 同样在预处理器定义中添加
_WIN32_WINNT=0x0A00(对应Windows 10,可根据目标系统调整,比如0x0601对应Windows 7),覆盖头文件中的默认定义,消除版本冲突警告。
3. 确保头文件有正确的重复包含保护
给你的头文件添加#pragma once或传统的#ifndef保护,避免头文件被多次#include时重复处理宏定义和头文件内容,从根源减少重复警告的出现。
内容的提问来源于stack exchange,提问作者BusterZo
相关产品推荐
相关产品推荐

