从64位转换为32位时,Gcc不会发出任何警告

时间:2013-03-25 08:21:46

标签: c++ gcc casting

这是我的代码:

int main()
{
    uint64_t a = 100;
    uint32_t b = a;
    return 0;
}

Gcc命令:

~$ gcc -o 1 1.c -Wall
~$

任何人都可以给我一些帮助吗?

2 个答案:

答案 0 :(得分:5)

使用-Wconversion选项。

-Wconversion     警告可能会改变值的隐式转换。这包括实数和整数之间的转换,如x为double时的abs(x);有符号和无符号之间的转换,如无符号ui = -1;和转换为较小的类型,如sqrtf(M_PI)。不要警告显式转换,如abs((int)x)和ui =(unsigned)-1,或者如果转换没有像abs(2.0)那样改变值。可以使用-Wno-sign-conversion禁用有关有符号和无符号整数之间转换的警告。

对于C ++,还要警告用户定义的转换会导致过载分辨率混乱;和从不使用类型转换运算符的转换:转换为void,相同类型,基类或对它们的引用。默认情况下,在C ++中禁用有符号和无符号整数之间的转换警告,除非明确启用了-Wsign-conversion。

在你的代码上:

从«uint64_t {aka long long unsigned int}»转换为«uint32_t {aka unsigned int}»可能会改变其值[-Wconversion]

答案 1 :(得分:2)

-Wall打开所有警告是一种常见的误解。

它打开“有关一些用户认为有问题的构造的所有警告,这些警告很容易避免(或修改以防止警告),即使与宏结合使用”(引用GCC手册) )。

只有-Wextra只有“启用一些未被-Wall 启用的额外警告标志”(同样来自GCC手册)。

还有-pedantic,它会在编译器清楚代码含义的情况下生成警告,但标准要求符合标准的编译器发出消息。 (GCC默认是默默地继续编译)。

即使启用了所有这三项,您也无法获得编译器能够提供的所有警告。有关详细信息,请查看编译器手册。