#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
也会在本地“取消”该修改。
我有一个带有几个插件的 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
也会在本地“取消”该修改。