ненужное (?) предупреждение Xcode - PullRequest
0 голосов
/ 24 октября 2009

Я использую Xcode в OS X 10.6 на Core 2 Duo. Вот короткая программа:

#include <stdio.h>

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

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

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

Ответы [ 3 ]

2 голосов
/ 24 октября 2009

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

Отличие, которое вы видите, состоит в том, что "Build Active Architecture Only" проверяется в конфигурации отладки, но не в конфигурации выпуска. Таким образом, 32-разрядная версия не создается, когда вы компилируете для Debug на 64-разрядной версии, и поэтому нет никаких предупреждений.

2 голосов
/ 24 октября 2009

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

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

0 голосов
/ 24 октября 2009

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

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

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

}

выходы

4.
8.
...