3

今日、私は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 バイトであることがわかっています。

がちょうど 2 バイトの場合uint_fast16_t、このコードはオーバーフローのために警告を出します。しかし、私の場合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 に答える