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

Dav*_*olm 5 c++ g++ clang compiler-warnings

当在下面的代码片段中将变量x声明为常量时,clang 2.9 和 g++ 4.1.2 都会生成警告。然而,当const被删除时,就像在代码片段中一样,即使使用以下我所知道的最严格的参数执行时,两个编译器都不会生成警告:“-Wall -Wextra -pedantic -ansi”

为什么编译器不会推断并报告相同的警告,因为x不是 volatile 并且在类型转换之前不可能被修改?

#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;
}
Run Code Online (Sandbox Code Playgroud)

使用const unsigned int x = 1000; g++ 提供消息“警告:大整数隐式截断为无符号类型”和clang“警告:从'const unsigned int'到'const unsigned char'的隐式转换将值从1000更改为232 [-Wconstant-conversion] ”。

有没有办法在不手动检查代码或依赖正确设计的单元测试的情况下自动检测这种情况?

edA*_*a-y 6

对于 GCC,添加标志-Wconversion,您将获得所需的警告。这不是其中的一部分,-Wall因为很多代码都忽略了这些类型的东西。我总是打开它,因为它很难调试缺陷。

  • @马蒂厄M。clang 的`-Weverything`。虽然在未来的这个时候你可能知道现在哈哈 (2认同)