C ++ 98の本来の意図は<cstdint>
、グローバル名前空間を汚染しないようにC ++で使用することでした(<cstdint>
特に、C ++ 11でのみ追加されますが、<c*>
ヘッダーは一般的に追加されます)。
ただし、実装はとにかくシンボルをグローバル名前空間に配置することに固執し、C++11はこの慣行を承認しました[*]。したがって、基本的に3つのオプションがあります。
- 使用
<cstdint>
して、使用する各整数型を完全に修飾するか、using std::int32_t;
etcでスコープに入れます(冗長であるため面倒ですが、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;
委員会は、ヘッダーファイルのトップレベルに固執するのとほぼ同じくらい有害な実装による慣行を承認したと主張する人もいるかもしれません-違いは、実装はC標準ライブラリのシンボルに対してのみ実行するのに対しusing namespace std;
、C++に対しては実行することです-シンボルのみ。C標準には、標準への将来の追加のために予約されている名前をリストするセクションがあります。これらの名前をC++グローバル名前空間でも予約済みとして扱うことは完全に愚かな考えではありませんが、必須ではありません。