1. ホーム
  2. c++

[解決済み] <cstdint> と <stdint.h> の比較

2022-11-28 08:35:45

質問

とはどのような違いがあるのでしょうか? stdint.hcstdint ?

どちらもMSVC(Visual Studio 2010)とgcc-4.5.1で利用可能です。また、どちらも intX_t / uintX_t タイプ(ここで X は型のバイト数)。

  • 両方のヘッダの根拠が同じ(ポータブルタイプ)である場合、どちらかを決定するためにどのような決定をしなければならないのでしょうか?

stdint.h は名前空間なしで各タイプを定義し cstdint の中にあります。 std 名前空間にあります。

  • 定義された型を std 名前空間に含める、含めないという理由はあるのでしょうか?この 2 つのヘッダーは何が違うのでしょうか?

cstdint はファイル拡張子を持たず c の接頭辞を持ちます。 stdint.h.h 拡張を使用します。

  • このヘッダの命名規則はどうなっているのでしょうか? その c のプレフィックスは、これが C ライブラリであることを示しています。 cstdint ?

どのように解決するのですか?

C++98 での本来の意図は、このような場合に備えて <cstdint> を使用することで、グローバル名前空間を汚染しないようにするというものでした(まあ、そうではなく <cstdint> は特に、C++11 で追加されただけですが、このような <c*> ヘッダーは一般的なものです)。

しかし、実装はとにかくシンボルをグローバル名前空間に置くことに固執し、C++11 はこの慣習を認めました[*]。したがって、基本的に 3 つの選択肢があります。

  • 使用する <cstdint> を使用し、使用する各整数型を完全に修飾するか、またはスコープ内に using std::int32_t; などとする(冗長なので煩わしいですが、C++ 標準ライブラリの他のシンボルと同様に正しい方法です)。
  • 使用方法 <stdint.h> (非推奨のため少し悪い)
  • 使用方法 <cstdint> を使用し、あなたの実装がシンボルをグローバルな名前空間に置くと仮定します(保証されないので非常にまずいです)。

実際には、迷惑なほど多くのコードが最後のオプションを使っていると思います。 <cstdint> がシンボルをグローバルな名前空間に置く実装で、誤ってやってしまいがちだからです。あなたは最初の選択肢を使うようにすべきです。2つ目の方法には1つの長所があり、それは が保証されていることです。 を保証してくれることです。それが特に有用であるとは思いませんが、それが優先事項である場合は、タイピングをいくらか節約できるかもしれません。

4つ目のオプションがあります。 #include <cstdint> の後に using namespace std; をつけると便利なことがあるのですが、中には using namespace std; . しかし、ヘッダーファイルのトップレベルにあるものは、cppファイルのトップレベルにあるものよりも悪く、限られた範囲内にあるものよりも悪いのです。人によっては、決して using namespace std; をまったく書かない人もいます。

[*] つまり、C++標準ヘッダはグローバル名前空間にものを置くことは許されていますが、そうする必要はないということです。つまり、これらのシンボルとの衝突を避けなければなりませんが、実際には存在しないかもしれないので使用することはできません。基本的に、C++のグローバル名前空間は地雷原なので、なるべく避けるようにしましょう。委員会は、実装による慣行を認めたと言えるかもしれません。 using namespace std; をヘッダファイルのトップレベルに貼り付けるのと同じくらい有害な実装を委員会が認めたと言えるかもしれません。 using namespace std; は C++ 専用のシンボルにも適用されるという違いがあります。C 標準には、将来標準に追加するために予約された名前をリストアップするセクションがあります。それらの名前を C++ のグローバル名前空間でも予約済みとして扱うことは、完全に愚かな考えというわけではありませんが、必須ではありません。