[解決済み] <cstdint> と <stdint.h> の比較
質問
とはどのような違いがあるのでしょうか?
stdint.h
と
cstdint
?
どちらも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++ のグローバル名前空間でも予約済みとして扱うことは、完全に愚かな考えというわけではありませんが、必須ではありません。
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] reinterpret_castはいつ使うのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] C 言語の型は (uint8_t/.../uint64_t) と (u_int8_t/.../u_int64_t) のどちらを使用すれば良いですか?
-
[解決済み] C++でC言語のヘッダーを使う場合、std::とグローバル名前空間のどちらから関数を使うべきでしょうか?