2012-09-19 2 views
12

Теперь я говорю о определении нового типа программистом с использованием ключевого слова typedef. Пока мои ученики привыкли к типу size_t (например, с помощью funciton length()), для которого я должен был попросить их немного потрудиться, чтобы просто «поверить», что это целочисленный тип, я думаю, что это будет здорово show noew, где этот тип определен.Где C++ size_t, определенный в linux

Итак, я сделал много grep в/usr/include в поле ubuntu, и я вижу, что size_t, в свою очередь, переопределяет size_type, который, в свою очередь, является переопределением metadata_type, и это конец в этом каталоге. Не найден окончательный «typedef unsigned int metadata_type;».

В/USR/SRC Я нашел anohter предыдущий тип, называемый yy_size_t, ...

Но, в любом случае я не смог добраться до конца цепочки.

Кто-нибудь знает, где узнать окончательное определение, чтобы проверить, что это unsigned int (или тому подобное)? Может быть, я пропустил пакет разработки в моей коробке? В этом случае, почему я могу скомпилировать программы с использованием типа size_t?

+0

Попробуйте рекурсивный grep: «grep -r» – Brady

+0

Возможный дубликат [std :: size_t vs size_t vs std :: ____ :: size_type] (http://stackoverflow.com/questions/8507851/stdsize-t- vs-size-t-vs-std-size-type) – trojanfoe

+0

@Brady: 'sudo apt-get install ack-grep' –

ответ

21

Вы можете попытаться расширить стандартные включаемые файлы с препроцессором C (cpp) вручную и проверьте вывод, что:

$ echo '#include <stdlib.h>' | cpp -I/usr/include - > stdlib-expanded.c 

Вы увидите, что выход cpp даже включает в себя маркеры, указывающие, из которых файл код stdlib-expanded.c был включен.

+2

+1 только 'echo '#include ' | cpp -I/usr/include | grep size_t' дает 'typedef long unsigned int size_t;' как первая строка – stijn

+0

за помощью –

+0

echo '#include ' | cpp -I/usr/include | grep size_t DID THE TRICK. БЛАГОДАРЯ! – user2548100

3

Как писали другие, вы, вероятно, можете найти его, если будете искать все включенные файлы. Однако тот факт, что это то, как работает большинство реализаций, не гарантируется.

В стандарте указано, что, например, #include <stddef.h> должно содержать определение для size_t, которое должно быть целым числом без знака. Но он также говорит, что нет необходимости в файле с именем stddef.h, чтобы существовать в любом месте файловой системы. И даже реализация, которая не предусматривает такой файл, но файл содержит только следующую строку

#pragma stdlib_stddef_h 

будет прекрасно соответствуя если выше Прагма эффективно обеспечивает то, что стандарт предписывает для этого заголовка.

Другими словами, size_t представляет собой целочисленный тип без знака, потому что это то, что говорит стандарт, а не потому, что это то, что вы можете прочитать в файле заголовка.

3

Просто для полноты, вы считали, что просто спрашиваете C++ о 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

НКУ предоставляет некоторые из заголовков и что имеет отношение здесь: 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-битные типы - для того, чтобы заголовок не зависел от аргументов компилятора).

Смежные вопросы