C: предупреждает о неявном преобразовании long в int - PullRequest
4 голосов
/ 19 ноября 2009

Мне было интересно, есть ли способ сказать компилятору (я на gcc версии 4.1.2 20080704 (Red Hat 4.1.2-46) или icc 11.1) выдавать предупреждение всякий раз, когда long-to-int происходит неявное преобразование. Например, компиляция файла test.c, который содержит код:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
    int n = atol(argv[1]);
    printf("int: %d\n", n);
    long int N = atol(argv[1]);
    printf("long: %ld\n", N);

    return 0;
}

с:

gcc -Wall -Wconversion test.c -o test

не выдает никаких предупреждений. Запуск получившегося двоичного файла как

./test 12345678901

Получаю, как и ожидалось:

int: -539222987
long: 12345678901

, поскольку число 12345678901 переполнило int, но не long. Я хотел бы, чтобы компилятор сообщал мне всякий раз, когда что-то подобное может произойти. Опция -Wconversion неожиданно (для меня) этого не делает.

Спасибо

Michele

Ответы [ 3 ]

4 голосов
/ 19 ноября 2009

Проверьте, имеет ли ваша версия gcc -Wshorten-64-to-32. Будьте готовы к потоку возможных ложных предупреждений о двойном преобразовании с плавающей запятой, если вы используете в своем коде число с плавающей запятой.

edit: Я думаю, shorten-64-to-32 может быть расширением Apple, которое, к сожалению, так и не было принято. Так что вам может не повезти, если вы не обновитесь до gcc-4.3 или выше.

3 голосов
/ 19 ноября 2009

Попробуйте gcc 4.3.0

http://gcc.gnu.org/wiki/NewWconversion

0 голосов
/ 19 ноября 2009

Поведение -Wconversion изменилось с GCC4.3 - обновите ваш компилятор и попробуйте снова (не могу проверить, действительно ли он работает сам, поскольку я на 32-битной системе, но как предупреждение правильно выводится для atoll, должно) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...