2009-10-23 4 views
0

Я запускаю Xcode в OS X 10.6 на Core 2 Duo. Вот короткая программа:ненужное (?) Предупреждение Xcode

#include <stdio.h> 

int main() { 
    long a = 8589934592L; 
    printf("a = %li\n", a); 
    return 0; 
} 

Когда я компилирую из командной строки (НКУ -pedantic) Я не получаю ошибки или предупреждения. Когда я компилирую это в Xcode в конфигурации отладки, я не получаю никаких ошибок или предупреждений. Когда я компилирую это в Xcode в конфигурации выпуска, я получаю предупреждение: «Переполнение в неявном постоянном преобразовании».

Долги должны быть 64-битными. И программа работает нормально. Итак, что происходит, и как мне избавиться от этого предупреждения?

ответ

2

Проверьте sizeof(long) и sizeof(long long), чтобы узнать, соответствует ли ваше предположение о long 64-разрядным типом.

Я просто попробовал вашу программу с Xcode 3.2.1 на Mac OS X 10.6.1 и не получил этого предупреждения. Мне удалось получить предупреждение, установив целевую конфигурацию на «32-разрядный универсальный» вместо «Стандартный 32/64-разрядный универсальный». Убедитесь, что вы строите подходящий тип машины!

+0

К сожалению, следовало бы объяснить: OS X использует модель данных LP64 (см. Http://developer.apple.com/macosx/64bit.html), в которой длинные бит 64 бит. – Everett

+0

Я предполагаю, что есть проект проекта Xcode, который указывает, что вы делаете 32-битный безопасный код. –

+0

Спасибо Карлу --- да, в этом была проблема. Я новичок в Xcode, и я не мог найти эту настройку, пока не получил подсказки. – Everett

0

Проблема здесь в том, что longs - это 32-битные, а не 64. long long - 64 бит.

На Mac Pro работает 10,6

#include <stdio.h> 
int main() { 
    printf("%d.\n", sizeof(long)); 
    printf("%d.\n", sizeof(long long)); 

} 

выходов

4. 
8. 
+0

Как указывает Рюдигер, это зависит от настроек сборки. Если вы выберете проект и получите информацию, вы можете настроить архитектуру на 32-разрядный универсальный, 64-разрядный Intel или стандартный 32/64-разрядный Universal. В зависимости от вашего выбора программа, которую вы включили выше, даст разные результаты ... – Everett

2

В настройках сборки проверьте "архитектуры". Если это «Стандартный (32/64-разрядный универсальный)», тогда будут созданы универсальные двоичные файлы с 32-разрядными и 64-битными версиями. Предупреждение предназначено для 32-битной сборки.

Разница, которую вы видите, относится только к «Build Active Architecture Only», которая проверяется в конфигурации Debug, но не в конфигурации Release. Таким образом, 32-разрядная версия не построена при компиляции для Debug на 64-битной основе, и, следовательно, нет никаких предупреждений.

+0

А! Спасибо! Это точно проблема. – Everett

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