Я никогда не использую 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-долго-долго
Этот код отлично работает для Windows, потому что Visual Studio по умолчанию создает 32-разрядные двоичные файлы, а android — 32-разрядная платформа. В этих платформах указатели 32-битные, и int
32-битные, так что можно хранить указатель в int
типизированный вектор или переменная.
Xcode по умолчанию будет собирать как 64-битный, так и 32-битный двоичный файл, если вы настроены на Mac OS X, и вы получите предупреждение о том, что на 64-битных платформах указатель внутри int
Переменная не очень хорошая идея, потому что половина значения указателя потеряна, и вы не сможете получить его позже.
Вы можете использовать два разных решения в вашем случае:
int
в size_t
и исправить все, что перестает работать из-за этого.Во втором случае вы можете отключить сборку 64-битного двоичного файла и использовать только 32-битные в Mac OS, изменив некоторые параметры в xcode. Для этого удалите x86_64
Строка из параметра «действующие архитектуры» в «настройках сборки» цели (если вы не можете найти этот параметр, выполните поиск изображений Google для xcode действительный параметр сборки архитектуры)
Ну, похоже, что GetUserData()
возвращает указатель Это похоже на sizeof(void*) > sizeof(int)
поэтому кастинг обрезает что-то
Изменить: Если он работает с int64, это подтверждает мое предположение (вы, кажется, сидите перед 64-битной машиной). Я не уверен, что вы пытаетесь сделать, но приведение указателей к целым числам — плохая идея. Я хотел бы предложить вам сделать fixturesArray
Контейнер подходящего типа значения, если вы хотите, чтобы это работало более независимо от архитектуры.