Разница между size_t и std :: size_t - PullRequest
117 голосов
/ 28 апреля 2011

Каковы различия между size_t и std::size_t с точки зрения того, где они объявлены, когда они должны использоваться и каких-либо других отличительных признаков?

Ответы [ 3 ]

75 голосов
/ 28 апреля 2011

C size_t и C ++ std::size_t одинаковы.

В C он определен в <stddef.h>, а в C ++ - в <cstddef>, содержимое которого совпадает с заголовком C (см. Цитату ниже). Он определяется как целочисленный тип без знака результата оператора sizeof .

Стандарт C говорит в §17.7 / 2,

size_t, который является целочисленным типом без знака результата результата оператора sizeof

И C ++ Standard говорит (о cstddef заголовке) в §18.1 / 3,

Содержимое совпадает с заголовком библиотеки Standard C, со следующими изменениями .

Так что да, оба одинаковы; единственное отличие состоит в том, что C ++ определяет size_t в std пространстве имен.

Также обратите внимание, что в приведенной выше строке также написано «со следующими изменениями» , что не относится к size_t. Скорее, это относится к новым дополнениям (в основном), внесенным C ++ в язык (не представлен в C), которые также определены в том же заголовке.


В Википедии есть очень хорошая информация о диапазоне и размере хранилища size_t:

Диапазон и размер хранилища size_t

Тип фактический size_t зависит от платформы ; распространенная ошибка предполагается, что size_t такой же, как int без знака, что может привести к ошибки программирования, [3] [4] при перемещении от 32 до 64-битной архитектуры, для Пример.

Согласно ISO C 1999 года стандарт (C99), size_t без знака целочисленный тип не менее 16 бит.

А остальное вы можете прочитать с этой страницы в википедии.

16 голосов
/ 28 апреля 2011

Из C ++ 03 "17.4.3.1.4 Типы":

Для каждого типа T из библиотеки Standard C (сноска 169), типы :: 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.

12 голосов
/ 28 апреля 2011

std :: size_t на самом деле stddef.h 's size_t .

cstddef даетследующее:

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

... эффективно перенести предыдущее определение в пространство имен std.

...