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 的编译器不是很符合标准,我并不总是理解它是如何以及何时决定抱怨某些事情的。
最近,在我的项目中添加了一个头文件后,我无法编译我的应用程序 - 我添加了空白头文件,然后出现了奇怪的错误:
[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 的编译器不是很符合标准,我并不总是理解它是如何以及何时决定抱怨某些事情的。