c++ - 为什么 g++ 或 clang 在通过将非 const 变量分配给较小类型的变量来截断它时不会引发警告?

标签 c++ g++ compiler-warnings clang

当变量 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/

相关文章:

c++ - 提升序列化与谷歌 Protocol Buffer ?

c++ - 在 C++ 中,当我对 -128,127 范围之外的整数值使用 static_cast<char> 时会发生什么?

c++ - gcc: local include path 隐藏系统头文件

c++ - 当没有显式关键字与单参数构造函数一起使用时,编译器可以发出警告吗?

c++ - 宏扩展中忽略警告 C6031 返回值

c++ - 编译器无法识别模板函数中的映射迭代器

c++ - 错误] 无法通过 'std::string {aka class std::basic_string<char>}' 传递非平凡可复制类型 '...' 的对象

c++ - 当局部变量具有相同名称时,如何在 C++ 中分配给实例变量?

c++ - placement-new 上的析构函数

Swift - 编译器警告我没有解包一个可选的但然后强制我解包使用!而不是?