5

这是我的代码:

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

gcc 命令:

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

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

4

2 回答 2

6

使用 -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]

于 2013-03-25T08:26:40.957 回答
2

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

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

甚至-Wextra只有“启用一些 -Wall 未启用的额外警告标志”(再次来自 GCC 手册)。

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

即使启用了所有三个,您也不会得到编译器能够给出的所有警告。查看编译器手册以获取更多详细信息。

于 2013-03-25T08:30:38.947 回答