Где С++ size_t, определенный в linux
Теперь я говорю о новом определении типа программистом с использованием ключевого слова typedef. Пока мои ученики привыкли к типу size_t (например, с помощью funciton length()), для которого я должен был попросить их немного потрудиться, чтобы просто "поверить", что это целочисленный тип, я думаю, что это будет здорово show noew, где этот тип определен.
Итак, я сделал много grep в /usr/include в поле ubuntu, и я вижу, что size_t, в свою очередь, переопределяет size_type, который, в свою очередь, является переопределением metadata_type и что end в этом каталоге. Не найден окончательный "typedef unsigned int metadata_type;".
В/usr/src Я нашел предыдущий тип anohter с именем yy_size_t,...
Но в любом случае мне не удалось добраться до конца цепочки.
Кто-нибудь знает, где узнать окончательное определение, чтобы проверить, что это unsigned int (или тому подобное)?
Может быть, я пропустил пакет разработки в моей коробке? В этом случае, почему я могу скомпилировать программы с использованием типа size_t?
Ответы
Ответ 1
Вы можете попытаться развернуть стандартные файлы include с препроцессором C (cpp
) вручную и проверить вывод этого:
$ echo '#include <stdlib.h>' | cpp -I/usr/include - > stdlib-expanded.c
Вы обнаружите, что вывод cpp
даже включает маркеры для указания, из каких файлов был добавлен код в stdlib-expanded.c
.
Ответ 2
gcc предоставляет некоторые из заголовков, и это актуально здесь: size_t
определяется в stddef.h
, который является одним из этих заголовков. Здесь он, например, находится в /usr/lib/x86_64-redhat-linux/4.1.1/include/stddef.h
. Там определение size_t
есть
typedef __SIZE_TYPE__ size_t;
__SIZE_TYPE__
- это предопределенный макрос компилятора (который позволяет гарантировать соответствие компилятора и заголовка и, как ожидается, от компилятора зависит от его аргументов - например, с -m32 это 32-битные биты без знака и с -m64 беззнаковыми 64-битными типами -, чтобы заголовок не зависел от аргументов компилятора).
Ответ 3
Как писали другие, вы, вероятно, можете найти его, если будете искать все включенные файлы. Однако тот факт, что это то, как работает большинство реализаций, не гарантируется.
В стандарте указано, что, например, #include <stddef.h>
должно содержать определение для size_t
, которое должно быть целым числом без знака. Но в нем также говорится, что нет необходимости в файле, который называется stddef.h, в любом месте файловой системы. И даже реализация, которая предоставляет такой файл, но этот файл содержит только следующую строку
#pragma stdlib_stddef_h
будет идеально соответствовать, если приведенная выше прагма эффективно обеспечивает то, что стандарт предписывает для этого заголовка.
Другими словами, size_t представляет собой целочисленный тип без знака, потому что это говорит стандарт, а не потому, что вы можете читать в файле заголовка.
Ответ 4
Просто для полноты, вы просто попросили С++ о size_t
?
#include <iostream>
#include <cstddef>
#include <limits>
int main()
{
std::cout << "sizeof(size_t) = " << sizeof(std::size_t) << std::endl;
std::cout << "is size_t an integer? " <<
(std::numeric_limits<std::size_t>::is_integer ? "yes" : "no")
<< std::endl;
std::cout << "is size_t signed? " <<
(std::numeric_limits<std::size_t>::is_signed ? "yes" : "no")
<< std::endl;
}
дает мне
sizeof(size_t) = 8
is size_t an integer? yes
is size_t signed? no
Ответ 5
std::size_t
определяется в <cstddef>
. См. http://en.cppreference.com/w/cpp/header/cstddef.