引用 windows 头文件的警告 / 错误

有时候需要包含一些平台相关的代码,如 windows.h 里面包含了很多头文件,其中一些定义了很多宏,如:

fileapi.h
1
2
3
4
5
#ifdef UNICODE
#define DeleteFile DeleteFileW
#else
#define DeleteFile DeleteFileA
#endif // !UNICODE

如果我们同时在代码中包含了 windows.h 和使用了 IPlatformFile 的接口来调用它的 DeleteFile 函数,因为 DeleteFile 被定义成了宏,所以在预处理阶段就会被替换,导致编译时访问 IPlatformFileDeleteFileW成员,但实际上它是不存在的,就产生了以下编译错误:

1
error C2039: 'DeleteFileW': is not a member of 'IPlatformFile'

解决办法就是不直接包含 windows.h 而是使用以下封装:

1
2
3
#include "Windows/AllowWindowsPlatformTypes.h"
#include "windows.h"
#include "Windows/HideWindowsPlatformTypes.h"

这样可以避免污染 UE 的符号名字。

UE 的文档中也有介绍:第三方库 #故障排除