【问题标题】:(C++11) g++ not providing a proper warning if cstdint types are used 'incorrectly'(C++11) 如果 cstdint 类型“不正确”使用,g++ 不会提供正确的警告
【发布时间】:2012-05-29 23:47:05
【问题描述】:

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

【问题讨论】:

  • 我在用不同的语言抱怨类似的事情,基本的回应是:uint_blahblah 只是内置类型的不同名称,而不是单独的类型。因此,如果您需要对此类内容进行类型检查,请不要使用它。

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


【解决方案1】:

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

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

【讨论】:

  • 通过编译器和库之间的仔细协调,编译器可以提供库可以 typedef 的内在类型。
  • 我明白了.. 也许我只是要编写自己的类,使用该限制扩展这些类型。只要我使用 uint_fast 和 uint_least 类型,我的代码无论如何都应该是可移植的,对吗?
猜你喜欢
  • 2011-08-25
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 2017-11-11
  • 2023-02-15
  • 2023-03-14
  • 2014-06-15
  • 2017-04-05
相关资源
最近更新 更多