#undef 会影响 C++ 中的成员函数吗?

Can #undef affect member functions in C++?

我有一个带有几个插件的 Unreal Engine 4 项目。其中一个插件包含一个 FileHelper class 和一个方法 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': is not a member of 'FileSystemHelper'

C3861 'CreateFile': identifier not found

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

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

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

#define CreateFile CreateFileW

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

然后

#undef CreateFile

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

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