我正在编译一个程序,该程序出现错误,因为 winnt.h 和 ntstatus.h 都包含在 WDK 中。我用预处理编译到一个文件并发现了这个:
#line 1 "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\um\\winnt.h"
还有这个:
#line 1 "C:\\Program Files (x86)\\Windows Kits\\10\\Include\\10.0.18362.0\\shared\\ntstatus.h"
这是我的内容:
#include <windows.h>
#include <winbase.h>
#include <winnt.h>
这是我得到的错误:
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\shared\ntstatus.h(66,14): warning C4005: 'STATUS_WAIT_0': macro redefinition
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um\winnt.h(2496): message : see previous definition of 'STATUS_WAIT_0'
我需要使用一个定义来告诉 VS 不要打开两者吗?
我正在使用 dokan 库。我发现 dokan.h 包含 ntstatus.h 并且有一个名为 WIN32_NO_STATUS 的定义来处理这个问题。
添加
UMDF_USING_NTSTATUS
定义
通用 Windows 标头包含序列,提供 NTSTATUS 代码,无需宏重新定义(例如 STATUS_SUCCESS),并修复了常见的 WinSock 问题:
#define UMDF_USING_NTSTATUS // facilitate clean inclusion of ntstatus.h header further below
#include <winsock2.h> // put before windows.h to fix macro redefinition issues: https://stackoverflow.com/a/1372836/1173555
#include <windows.h>
#include <ntstatus.h>
归功于 Dmytro 的 UMDF_USING_NTSTATUS 见解。
就我而言,您可以使用精确值而不是 NT 状态宏。 那么你就不再需要
#include <ntstatus.h>
了
例如,您可以在代码中使用 0
而不是 STATUS_SUCCESS
。
希望有帮助。