В чем разница между size_t
и std::size_t
в том, где они объявлены, когда они должны использоваться и какие-либо другие отличительные функции?
Разница между size_t и std:: size_t
Ответ 1
C size_t
и С++ std::size_t
совпадают.
В C он определен в <stddef.h>
и в С++, определенный в <cstddef>
, содержимое которого совпадает с содержимым C (см. цитату ниже). Его определяют как беззнаковый целочисленный тип результата оператора sizeof.
C Стандарт говорит в §17.7/2,
size_t, который является беззнаковым целым типом результата оператора sizeof
И в С++ Standard говорится (о заголовке cstddef
) в §18.1/3,
Итак, да, оба одинаковы; Единственное отличие состоит в том, что С++ определяетСодержимое совпадает с заголовком библиотеки Standard C со следующими изменениями.
size_t
в пространстве имен std
.
Также обратите внимание, что приведенная выше строка также говорит "со следующими изменениями", которая не относится к size_t
. Это скорее относится к новым дополнениям (в основном), сделанным С++, в язык (не представленный в C), которые также определены в одном заголовке.
Википедия имеет очень хорошую информацию о диапазоне и размере памяти size_t:
Диапазон и размер хранилища size_t
Тип фактический size_t зависит от платформы; распространенная ошибказаключается в том, чтобы size_t был таким же, как unsigned int, что может привести к ошибки программирования [3] [4] при перемещении от 32 до 64-битной архитектуры, для Пример.
Согласно ИСО 1999 года стандарт (C99), size_t является неподписанным целочисленный тип не менее 16 бит.
И остальное вы можете прочитать эту страницу в википедии.
Ответ 2
Из С++ 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.
Ответ 3
std:: size_t на самом деле stddef.h size_t.
cstddef дает следующее:
#include <stddef.h>
namespace std
{
using ::ptrdiff_t;
using ::size_t;
}
... эффективно приведение предыдущего определения в пространство имен std.