隐式转换警告 int 到 int-looklike



我的编译器对很多隐式转换让我感到温暖:

有些我确实理解,比如

implicit conversion changes signedness: 'int' to 'std::vector::size_type' (aka 'unsigned long')` 

当我做myvector.resize(myInt).

其他更晦涩难懂的,比如

implicit conversion loses integer precision: 'std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size_type' (aka 'unsigned long') to 'int'

当我做myInt=myString.size()时,或

implicit conversion changes signedness: 'int' to 'std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::size_type' (aka 'unsigned long')

当我打电话给myString[myInt]

我所有情况下,我确实理解为什么我会收到这些消息(int-uint 等(,但是它们的使用在程序中是明确的。如果我不搜寻更改变量的类型以删除这些警告,我会有什么风险? 我以前的编译器没有警告我任何事情,所以当我更换电脑时,我突然收到了几十个警告。

我在所有情况下,我确实明白为什么我会收到这些消息(int-uint 等(, 但是,它们的使用在程序中是明确的。如果我冒什么风险 不要搜索更改我的变量类型以删除这些警告?

这与模棱两可无关。 如果将有符号值转换为无符号类型,可能会得到奇怪的结果:

long i = -2147483645;        // for example
std::vector<int> vec{0, 1, 2, 3, 4};
std::cout << vec[i] << "n"; // undefined behavior, not always caught

在这里,假设一个 32 位系统,i在传递给operator[]之前被转换为2147483651,从而导致未定义的行为。

如果您真的确定转换是无害的,您可以做一个static_cast

static_cast<std::vector<int>::size_type>(i)

我以前的编译器没有警告我任何事情,所以当我更改我的 电脑我突然有几十个警告。

始终打开警告。至少做-Wall. 在编写库时,我倾向于确保我的代码即使使用-Wextra也能干净地编译。 他们可以帮助您捕获很多错误。

stl 的size_type归结为编译器的一个unsigned long。这会在将其分配给有符号类型(如int(时发出implicit conversion changes signedness警告。

此外,long的宽度取决于 CPU 架构,即 x86 上的 32 位,x64 上的 64 位,而int定义为 32 位宽度。这将发出implicit conversion loses integer precision警告。

我以前的编译器没有警告我任何事情,所以当我更改我的 电脑我突然有几十个警告

新PC上的警告级别可能更高。检查-W3(Windows(、-Wall-Wextra(GCC( 的编译器选项。

如果我不狩猎,我会冒什么风险,将变量的类型更改为 删除这些警告?

它至少是糟糕的风格,如果 stl 容器的大小不适合 int,则会导致未定义的行为。

相关内容

  • 没有找到相关文章

最新更新