0

我有一个带有多个插件的虚幻引擎 4 项目。这些插件中的一个包含一个FileHelper带有方法的类CreateFile。这几个月来一直运行良好,但在最近的一次提交中,一个不同的插件添加了一个调用FileHelper::CreateFile,现在有时我收到一个链接器错误,说它CreateFileW不是成员FileHelper(这不会出现在每个构建中,我还无法解释)。我继续CreateFile像这样暂时取消定义

#include "UtilPlugin/File/FileSystemHelper.h"

#ifdef _WIN32
#pragma push_macro("CreateFile")
#undef CreateFile
#endif //_WIN32

...//new code including CreateFile call

#ifdef _WIN32
#pragma pop_macro("CreateFile")
#endif //_WIN32

但现在我收到错误

C2039“CreateFile”:不是“FileSystemHelper”的成员

C3861'CreateFile':找不到标识符

由于我知道CreateFile在其他地方被成功调用(至少在与 相同的插件中FileSystemHelper),我知道它存在。

因此我的问题是,如果 undefine 可以影响这样的成员函数。我已将#undef代码中包含的部分移到上面,并且不再出现错误,但由于它看似随机发生,我不完全确定我是否真的解决了问题。

4

1 回答 1

1

下面显示了一个有问题的案例:

#define CreateFile CreateFileW

struct S
{
    void CreateFile(); // Actually void CreateFileW();
};

接着

#undef CreateFile

void foo()
{
   S s;
   s.CreateFile(); // Error, "expect" s.CreateFileW()
}

由于#define可能会(本地)修改代码的含义,因此#undef也会在本地“取消”该修改。

于 2021-08-27T10:51:27.580 回答