Что мне нужно сделать, чтобы использовать 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__
Другие вопросы по тегам