(C ++ 11)如果cstdint类型被“错误地”使用,g ++没有提供正确的警告

时间:2012-05-29 23:47:05

标签: c++ c++11 compiler-warnings cstdint

今天我尝试了 cstdint 头文件中定义的一些类型: std::uint16_tstd::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

1 个答案:

答案 0 :(得分:4)

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

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