2014-09-09 3 views
0

Я никогда не использую macs или xcode, но мне нужно сейчас, чтобы построить библиотеку C++ для osx и ios. : C++ код строит отлично подходит для окон и андроида, но в Xcode я получаю сотни этих икон красный excmalation метки, указывающие на это:Ошибка сборки xcode: семантическая проблема, отличная от указателя на меньший тип 'int', теряет информацию

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 

UPDATE: Там были только около 10 или около экземпляры этой ошибки (остальные 100 из вещей были предупреждения) Если я изменяю «Int» в «int64 «Во всех этих случаях я могу построить. Но я не хочу этого делать, я уверен, что это проблема на стене, но не то, как программа должна работать.

UPDATE2: Также оставив код так, как это и просто удаление этих флагов позволяет мне строить
-Wno длиной длиной

+0

Показать объявление 'fixturesArray' и' GetUserData () '. – trojanfoe

+0

потенциальных дубликатов: https://stackoverflow.com/questions/22419063/error-cast-from-pointer-to-smaller-type-int-loses-information-in-eaglview-mm и https://stackoverflow.com/ вопросы/21232460/disabling-cast-from-pointer-to-less-type-uint32-t-error-in-clang –

ответ

1

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

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

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

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

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

+1

... или вы можете вообще отказаться от приведения в действие. – trojanfoe

+0

@trojanfoe могут быть причины, для которых массив должен быть интегральным. Я предлагаю никогда не использовать C-ролики, потому что они являются источником неожиданного поведения, если это необходимо, вместо использования стилей C++, но это другая проблема, чем обсуждаемая здесь. – pqnet

+0

Просьба указать некоторые из этих причин. – trojanfoe

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^