回答:
C size_t
とC ++ std::size_t
はどちらも同じです。
Cにおいては、で定義されています<stddef.h>
その中で定義され、C ++で<cstddef>
、その内容(以下の引用を参照されたい)Cヘッダと同じです。そのように定義された符号なし整数型の結果のはsizeofオペレータ。
C Standardは§17.7/ 2で、
あるsize_tの符号なし整数型の結果のはsizeofオペレータ
そしてC ++標準はcstddef
§18.1/ 3で(ヘッダーについて)言っています、
内容は標準Cライブラリのヘッダーと同じですが、次の点が異なります。
ええ、どちらも同じです。唯一の違いは、C ++ size_t
がstd
名前空間で定義することです。
また、上記の行には「次の変更を伴う」 とあり、を参照していないことにも注意してくださいsize_t
。これは、同じヘッダーで定義されている言語(Cには存在しない)へのC ++による(主に)新しい追加を指します。
ウィキペディアには、size_tの範囲とストレージサイズに関する非常に優れた情報があります。
size_tの範囲とストレージサイズ
size_t の実際のタイプは プラットフォームに依存します。一般的な間違いは 、size_tのは、プログラミングエラーにつながることができ、unsigned int型と同じであると仮定することである[3] [4]例えば、64ビットアーキテクチャに32から移動するとき。
1999 ISO C標準(C99)によれば、size_tは少なくとも16ビットの符号なし整数型です。
残りはウィキペディアのこのページから読むことができます。
size_t
なしにusing namespace std;
かusing std::size_t;
。ただし、ほとんどのコンパイラーはこれを許可し、標準では特に許可しています(§D.5/ 3)。
<cstddef>
はを宣言する場合としない::size_t
場合があります。そのため、宣言されていること<stddef.h>
が保証されているCライブラリからのヘッダーまたは別のヘッダーを明示的にインクルードする場合を除いて、ヘッダーが存在する、または存在しないとは限りません。
::size_t
はに存在する<stddef.h>
ため、常にで修飾する必要はありませんstd::
。
C ++ 03「17.4.3.1.4タイプ」から:
標準Cライブラリ(脚注169)の各タイプTについて、タイプ:: Tおよびstd :: Tは実装用に予約されており、定義されている場合、:: Tはstd :: Tと同一でなければなりません。
そして脚注169:
これらのタイプは、clock_t、div_t、FILE、fpos_t、lconv、ldiv_t、mbstate_t、ptrdiff_t、sig_atomic_t、size_t、time_t、tm、va_list、wctrans_t、wctype_t、およびwint_tです。
std::T
定義されているバリアントに依存すべきではないのですか?
#include <stddef.h>
、その後std::size_t
たり、使用できない場合があります。あなたがもし#include <cstddef>
、次にstd::size_t
利用可能ですが、size_t
ではないかもしれません。
std::
あり、段落では、それらをトップレベルのネームスペースで定義することもでき、定義する場合はそれらをトップレベルでも同じように定義する必要があると述べていstd::
ます。ほとんどのコンパイラはCヘッダーをインクルードし、名前をstd::
にインポートするだけなので、シンボルは両方で定義されます。
std::
Cの海岸から来る識別子のバリアントを気にすることはありません。私<xxxxx.h>
は標準のCヘッダーにこだわっています-それは問題ではありませんでした。それで、私は使用<stddef.h>
しsize_t
、決して考え直しませんstd::size_t
。実際、が存在する(または存在する可能性がある)ことを頭に浮かぶことはありませんstd::size_t
。
std :: size_tは、実際にはstddef.hのsize_tです。
cstddefは以下を提供します。
#include <stddef.h>
namespace std
{
using ::ptrdiff_t;
using ::size_t;
}
...以前の定義をstd名前空間に効果的に取り込みます。
<cstddef>
し、取得できると期待し::size_t
ていますが、含まれている場合<stddef.h>
、あなたが取得しますstd::size_t
。
<stddef.h>
だけであなたを取得します::size_t
。
<cstddef>
と、確実に取得され、取得されるstd::size_t
可能性もあります::size_t
(ただし、それは保証されません)。含める<stddef.h>
と、確実に取得され、取得される::size_t
可能性もありますstd::size_t
(ただし、それは保証されません)。これはC ++ 03では異なりましたが、事実上実装できず、不具合として修正されました。