Ошибка сборки xcode: семантическая проблема, приведенная от указателя к меньшему типу ‘int’, теряет информацию

Я никогда не использую macs или xcode, но мне нужно сейчас, чтобы создать библиотеку C ++ для osx и ios.
Код C ++ прекрасно работает для Windows и Android, но в XCode я получаю сотни этих красных значков знака эксмаляции, указывающих на это:

 Semantic issue
cast from pointer to smaller type
'int' loses information

Вот пример строки кода, указывающей на эту ошибку

    fixturesArray.push_back((int)fixture->GetUserData());

У меня уже была проблема с неиспользуемыми переменными, и я убрал флаг -Werror, и это решило эту конкретную проблему. Есть ли что-то подобное, что я могу сделать для этой проблемы? Я предполагаю, что проблема заключается в том, что предупреждения рассматриваются как ошибки.
Вот другие флаги, которые все еще там ..

-Wall  -Wno-long-long -Wno-variadic-macros     -DNDEBUG -DDEBUG=0

ОБНОВЛЕНИЕ: Было только приблизительно 10 или около того случаев этой ошибки (другие 100 вещей были предупреждениями). Если во всех этих случаях я изменю ‘int’ на ‘int64’, я смогу построить. Но я не хочу этого делать, я уверен, что это вызовет проблемы, это не то, как программа должна работать.

ОБНОВЛЕНИЕ 2: оставляя код таким, какой он есть, и просто удаляя эти флаги, я могу построить
-Wno-долго-долго

0

Решение

Этот код отлично работает для Windows, потому что Visual Studio по умолчанию создает 32-разрядные двоичные файлы, а android — 32-разрядная платформа. В этих платформах указатели 32-битные, и int 32-битные, так что можно хранить указатель в int типизированный вектор или переменная.

Xcode по умолчанию будет собирать как 64-битный, так и 32-битный двоичный файл, если вы настроены на Mac OS X, и вы получите предупреждение о том, что на 64-битных платформах указатель внутри int Переменная не очень хорошая идея, потому что половина значения указателя потеряна, и вы не сможете получить его позже.

Вы можете использовать два разных решения в вашем случае:

  • исправить код, меняя int в size_t и исправить все, что перестает работать из-за этого.
  • решите, что вы не хотите это исправлять и что не собираетесь поддерживать 64-битную платформу.

Во втором случае вы можете отключить сборку 64-битного двоичного файла и использовать только 32-битные в Mac OS, изменив некоторые параметры в xcode. Для этого удалите x86_64 Строка из параметра «действующие архитектуры» в «настройках сборки» цели (если вы не можете найти этот параметр, выполните поиск изображений Google для xcode действительный параметр сборки архитектуры)

1

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

Ну, похоже, что GetUserData() возвращает указатель Это похоже на sizeof(void*) > sizeof(int) поэтому кастинг обрезает что-то

Изменить: Если он работает с int64, это подтверждает мое предположение (вы, кажется, сидите перед 64-битной машиной). Я не уверен, что вы пытаетесь сделать, но приведение указателей к целым числам — плохая идея. Я хотел бы предложить вам сделать fixturesArray Контейнер подходящего типа значения, если вы хотите, чтобы это работало более независимо от архитектуры.

0