4

我想知道是否有办法告诉编译器(我在 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 出人意料地(对我来说)不会这样做。

谢谢,

米歇尔

4

3 回答 3

4

检查您的 gcc 版本是否有-Wshorten-64-to-32. 如果您在代码中使用浮点,请为大量可能虚假的 double -> float 转换警告做好准备。

编辑:shorten-64-to-32可悲的是,我认为可能是主线从未采用的 Apple 扩展。因此,除非您升级到 gcc-4.3 或更高版本,否则您可能会不走运。

于 2009-11-18T23:19:43.070 回答
3

试试 gcc 4.3.0

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

于 2009-11-18T23:22:54.697 回答
0

-Wconversion 使用 GCC4.3 更改的行为- 更新您的编译器并重试(无法检查它是否真的有效,因为我在 32 位系统上,但是当警告正确发出时atoll,它应该)...

于 2009-11-18T23:20:20.963 回答