C++Builder 调用未定义函数 hypot/ceil/floor/fabs

C++Builder call to undefined functions hypot/ceil/floor/fabs

最近,在我的项目中添加了一个头文件后,我无法编译我的应用程序 - 我添加了空白头文件,然后出现了奇怪的错误:

[bcc32 Error] SystemTypes.h(79): E2268 Call to undefined function 'hypot'
[bcc32 Error] SystemTypes.h(511): E2268 Call to undefined function 'ceil'
[bcc32 Error] SystemTypes.h(525): E2268 Call to undefined function 'fabs'

这些错误来了"from nowhere" - 我还玩了另一个空项目,将调试模式更改为发布后它们出现了。我该如何修复它们?我不知道他们为什么会出现。您可以在下面看到一个错误的完整解析器上下文:

  Full parser context
    Project3.cpp(3): #include c:\program files (x86)\embarcadero\studio.0\include\windows\vcl\vcl.h
    vcl.h(10): #include c:\program files (x86)\embarcadero\studio.0\include\windows\vcl\basepch0.h
    basepch0.h(63): #include c:\program files (x86)\embarcadero\studio.0\include\windows\rtl\System.Types.hpp
    System.Types.hpp(19): #include c:\program files (x86)\embarcadero\studio.0\include\windows\rtl\SystemTypes.h
    SystemTypes.h(32): namespace System
    SystemTypes.h(32): namespace Types
    SystemTypes.h(33): class TSmallPoint
    SystemTypes.h(87): decision to instantiate: double TSmallPoint::Distance(const TSmallPoint &) const
    --- Resetting parser context for instantiation...
    SystemTypes.h(84): parsing: double TSmallPoint::Distance(const TSmallPoint &) const

您需要这个包含语句:

#include <math.h>

简答:如, #include <math.h>.

长答案:这些消息告诉您出了什么问题:

SystemTypes.h(87): decision to instantiate: double TSmallPoint::Distance(const TSmallPoint &) const
--- Resetting parser context for instantiation...
SystemTypes.h(84): parsing: double TSmallPoint::Distance(const TSmallPoint &) const

所以编译器试图将 TSmallPoint::Distance 和 运行 实例化为一个问题。如果您查看 TSmallPoint::Distance 的实现,您会看到类似这样的内容:

double Distance(const TSmallPoint& p2) const _ALWAYS_INLINE {
  return hypot(p2.x - this->x, p2.y - this->y);
} 

还有对 hypot 的神秘引用给您带来了麻烦。 SystemTypes.h 引用 hypot 而不包含 <math.h> 本身是一个错误。它已在我的 XE2 副本中修复(我不再有 XE 来检查自己),但您应该能够通过包含 <math.h> 来解决它。 (如果需要,您甚至可以编辑 SystemTypes.h 并在其中添加包含。)

至于为什么它出现在发布版本而不是调试版本中 - 我不确定。它是一个内联函数,内联函数在发布版本和调试版本中的处理方式通常不同,对 "instantiate" 的引用听起来也可能正在进行一些模板实例化,这会使事情进一步复杂化。 C++Builder 的编译器不是很符合标准,我并不总是理解它是如何以及何时决定抱怨某些事情的。