C ++ Builder вызов неопределенных функций 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'

Эти ошибки возникли «из ниоткуда» — я тоже играл с другим пустым проектом, и они появились после смены режима отладки на релиз. Как я могу их исправить? Понятия не имею, почему они появились. Ниже вы можете увидеть полный контекст парсера одной ошибки:

  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

0

Решение

Краткий ответ: как @ Пламя сказал, #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 не очень соответствует стандартам, и я не всегда понимаю, как и когда он решает пожаловаться на что-то.

0

Другие решения

Вам нужно это включить заявление:

#include <math.h>
0

По вопросам рекламы [email protected]