gpt4 book ai didi

c++ - (C++11) 如果使用 cstdint 类型,g++ 不提供适当的警告 'incorrectly'

转载 作者:太空狗 更新时间:2023-10-29 21:05:06 37 4
gpt4 key购买 nike

今天我正在尝试在 cstdint 头文件中定义的一些类型:std::uint16_t, std::uint_least16_t 等等..

我认为它们非常有用,因为您确切地知道或至少知道它们有多大,这与更常见的平台特定的不同:intunsigned int 和很快..但是我认为有一个问题会导致很多错误。

假设我们有这段代码:

#include <cstdint>
#include <iostream>

int main()
{
std::uint_fast16_t test = 0;

test = 65536;

std::cout << test;

return 0;
}

我们知道 std::uint_fast16_t 应该至少为 2 个字节。

如果 uint_fast16_t 刚好是 2 个字节,这段代码会因为溢出而发出警告。但在我的例子中,uint_fast16_t 是 8 个字节(之前检查过)。

因此,在我的例子中,这段代码编译并运行良好,在另一个例子中,我们收到警告。我们的代码不可移植。这对我来说是错误的。即使变量可以保存该数据,编译器至少应该给我们一个警告或建议我们使用更大的类型。我对吗?还是我误解了这些类型的用途?

我使用带有这些标志的 g++ 编译了代码

-Wall -Werror -pedantic -std=c++0x

最佳答案

编译器无法提供任何其他警告,因为这些类型是 typedef,并且它们被完全视为它们是同义词的类型。这就是 C++ 的工作原理。你有 UINT_FAST16_MAX可能还有 std::numeric_limits<std::uint_fast16_t>::max()告诉你这个类型可以容纳的最大值。使用这些信息是您的工作。

另外请记住,大多数由 stdint 定义的类型实际上是可选的,因此仅使用它们而不检查它们是否存在会使您的代码不可移植。

关于c++ - (C++11) 如果使用 cstdint 类型,g++ 不提供适当的警告 'incorrectly',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10808255/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com