3

今天我正在尝试在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

4

1 回答 1

4

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

还要记住,stdint 定义的大多数类型实际上是可选的,所以只需使用它们而不检查它们是否存在,你就会使你的代码不可移植。

于 2012-05-29T23:51:27.427 回答