【问题标题】:Can #undef affect member functions in C++?#undef 会影响 C++ 中的成员函数吗?
【发布时间】:2021-08-27 07:25:33
【问题描述】:

我有一个带有多个插件的虚幻引擎 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 部分移到代码中包含的上方,并且不再出现错误,但由于它看似随机发生,我不完全确定我是否真的解决了问题。

【问题讨论】:

  • #undef 是一个预处理器指令。预处理器修改代码(例如源文件包含或宏扩展),编译器编译修改后的代码,而不是原始代码。
  • 大概是在定义CreateFile函数时定义了宏,导致定义实际上是针对CreateFileWCreateFileA
  • 我不确定我是否完全理解。这是否意味着#undef 会影响成员,无论它是放在代码中包含之前还是之后?

标签: c++ linker unreal-engine4 undef


【解决方案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 也会在本地“取消”该修改。

【讨论】:

  • 所以由于定义来自某些窗口或虚幻标题,我不能简单地删除它,正确的方法是在文件中使用(在您的示例中)struct S{...} 取消定义它?
  • “正确”方式主要是一种解决方法,以避免宏泄漏到代码的其他部分:-/。重命名您的 CreateFile 也可以解决问题,或者确保在任何地方都定义了 MACRO 也是一种选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 2012-11-04
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
相关资源
最近更新 更多