当变量 x 在下面的代码片段中声明为常量时,clang 2.9 和 g++ 4.1.2 都会生成警告。然而,当 const 被删除时,就像它在代码片段中一样,即使使用以下我所知道的最严格的参数执行时,两个编译器都不会生成警告:“-Wall -Wextra -pedantic -安西”
为什么编译器不会推断并报告相同的警告,因为 x 不是可变的并且在类型转换之前不可能被修改?
#include <iostream>
int main(int argc, char **argv)
{
unsigned int x = 1000;
const unsigned char c = x;
const unsigned int x_ = c;
std::cout << "x=" << x << " x_=" << x_ << std::endl;
return 0;
}
使用 const unsigned int x = 1000; g++ 提供消息“警告:大整数隐式截断为无符号类型”和 clang“警告:隐式转换从“const unsigned int”到“const unsigned char”将值从 1000 更改为 232 [-Wconstant-conversion]”。
有没有什么方法可以在不手动检查代码或依赖正确设计的单元测试的情况下自动检测这种情况?
最佳答案
对于 GCC,添加标志 -Wconversion
,您将得到所需的警告。它不是 -Wall
的一部分,因为太多的代码只是忽略了这些类型的东西。我总是打开它,因为它很难调试缺陷。
关于c++ - 为什么 g++ 或 clang 在通过将非 const 变量分配给较小类型的变量来截断它时不会引发警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5975566/