web-dev-qa-db-ja.com

size_tとstd :: size_tの違い

size_tstd::size_tの違いは、それらが宣言されている場所、使用するタイミング、および他の差別化機能に関してどのようなものですか?

119
Mankarse

Cのsize_tとC++のstd::size_tは両方とも同じです。

Cでは<stddef.h>で定義され、C++では<cstddef>で定義され、その内容はCヘッダーと同じです(以下の引用を参照)。その定義はの符号なし整数型result sizeof演算子。

C Standardは、§17.7/ 2で、

size_tは、の符号なし整数型resultsizeof演算子

そして、C++ Standardは、§18.1/ 3で(about cstddef header)と述べています。

内容は標準Cライブラリヘッダーと同じですが、次の変更があります

そう、両方とも同じです。 唯一の違いは、C++がstd名前空間にsize_tを定義していることです。

また、上記の行には「次の変更あり」があり、size_tを参照していないことにも注意してください。むしろ、同じヘッダーで定義されている言語(Cには存在しない)にC++によって行われた(主に)新しい追加を指します。


ウィキペディアには、size_tの範囲とストレージサイズに関する非常に優れた情報があります。

size_tの範囲とストレージサイズ

Size_tのactualタイプは、platform-dependent; よくある間違いは、size_tがunsigned intと同じであると仮定することです。これは、プログラミングエラーを引き起こす可能性があります。たとえば、64ビットアーキテクチャ。

1999 ISO C標準(C99)によると、size_tは少なくとも16ビットの符号なし整数型です。

そして、残りはウィキペディアの このページ から読むことができます。

77
Nawaz

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です。

16
Michael Burr

std :: size_tは実際にはstddef.hsize_tです。

cstddefは以下を提供します:

#include <stddef.h>
namespace std 
{
  using ::ptrdiff_t;
  using ::size_t;
}

...前の定義をstd名前空間に効果的に持ち込む。

12
hifier