You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 06:13:31