Где С++ 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