【发布时间】:2012-05-29 23:47:05
【问题描述】:
今天我正在尝试 cstdint 头文件中定义的一些类型:
std::uint16_t、std::uint_least16_t等等..
我认为它们非常有用,因为您确切地知道或至少知道它们有多大,不像更常见的特定于平台的那些:int、unsigned 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