Что мне нужно сделать, чтобы использовать tgmath на iOS?
Я собираю свой первый проект с поддержкой 64 бит. Я сталкиваюсь с кучей предупреждений компилятора о неявных преобразованиях с плавающей точкой. Это происходит потому, что я использую fabsf() и присваиваю результат CGFloat (который является двойным, а не плавающим в новой 64-битной архитектуре).
Согласно ответу на этот вопрос:
Математические функции на основе CGFloat?
Мне просто нужно #include <tgmath.h>
решить эту проблему и, возможно, изменить fabsf
в fabs
, У меня есть по крайней мере один файл, где это, кажется, не помогает. Я все еще получаю предупреждение: implicit conversion loses floating-point precision 'double' to 'CGFloat' aka (float).
Вот строка, которая генерирует это предупреждение:
CGFloat deltaX = fabs(item.center.x-point.x);
Кто-нибудь еще сталкивался с этим? Как ты это решил? Я бы предпочел не отключать это предупреждение и не засорять мой код кучей типов.
2 ответа
Я смог получить tgmath.h
функции для работы, включая заголовок в верхней части моего файла PCH.
В какой-то момент (читай: Xcode update) мне пришлось начать отключать модули, чтобы заставить это работать. Подробности такого рода в вопросе Димы приведены ниже.
Я предполагаю, что вы используете типы CGPoint, поэтому преобразование происходит не в fabs(DOUBLE -> FLOAT), а при назначении CGFloat = DOUBLE. Это, вероятно, потому, что компилятор использовал fabs из math.h, который работает на double.
Проблема с math.h заключается в том, что он внутренне импортируется заголовками OSX (углерод, если я правильно помню), поэтому я думаю, что некоторые заголовки iOS также могут это сделать. После быстрого просмотра кажется, что базовый набор фреймворков не импортирует math.h, так что, вероятно, вам стоит искать его импортируемый вручную. В случае, если он импортирован внутренне некоторыми системными библиотеками, вы, вероятно, не сможете использовать эти библиотеки и tgmath в одном файле реализации.
Если вы хотите проверить наличие каких-либо зависимостей math.h, вы можете использовать грязный трюк, чтобы предотвратить его включение - добавьте эту строку в файл (или лучше поверх файла префикса):
#define __MATH_H__