Недавно, после добавления одного заголовочного файла в мой проект, я перестал иметь возможность компилировать свое приложение — я добавил пустой заголовочный файл, и затем появились странные ошибки:
[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'
Эти ошибки возникли «из ниоткуда» — я тоже играл с другим пустым проектом, и они появились после смены режима отладки на релиз. Как я могу их исправить? Понятия не имею, почему они появились. Ниже вы можете увидеть полный контекст парсера одной ошибки:
Full parser context
Project3.cpp(3): #include c:\program files (x86)\embarcadero\studio\16.0\include\windows\vcl\vcl.h
vcl.h(10): #include c:\program files (x86)\embarcadero\studio\16.0\include\windows\vcl\basepch0.h
basepch0.h(63): #include c:\program files (x86)\embarcadero\studio\16.0\include\windows\rtl\System.Types.hpp
System.Types.hpp(19): #include c:\program files (x86)\embarcadero\studio\16.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>
,
Длинный ответ: эти сообщения говорят вам, что не так:
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
и добавьте туда, если хотите.)
Что касается того, почему он появляется в сборках релиза, а не в отладочных сборках — я не уверен. Это встроенная функция, и встроенные функции обычно обрабатываются по-разному в сборках выпуска по сравнению с сборками отладки, и ссылка на «создание экземпляров» звучит так, как будто может происходить также создание экземпляра шаблона, что может еще более усложнить ситуацию. Компилятор C ++ Builder не очень соответствует стандартам, и я не всегда понимаю, как и когда он решает пожаловаться на что-то.
Вам нужно это включить заявление:
#include <math.h>