2012-09-19 29 views
12

Ahora estoy hablando de una nueva definición de tipo por un programador usando la palabra clave typedef. Siempre que mis alumnos estén acostumbrados al tipo size_t (por ejemplo, al usar funciton length()), para lo cual tuve que pedirles un pequeño esfuerzo para simplemente "creer" que es un tipo entero, creo que sería genial muéstreles donde se define este tipo.Dónde se define C++ size_t en Linux

Así que he hecho mucho grep en/usr/include en un cuadro ubuntu, y lo que veo es que size_t es, a su vez, una redefinición de size_type que a su vez es una redefinición de metadata_type, y eso es el final en este directorio. No se encuentra el final "typedef unsigned int metadata_type;".

en/usr/src he encontrado anohter tipo anterior llamada yy_size_t, ...

Pero, en cualquier caso, no he podido llegar a la final de la cadena.

¿Alguien sabe dónde encontrar la definición final para comprobar que es una int sin firmar (o similar)? ¿Puedo perder un paquete de desarrollo en mi caja? En este caso, ¿por qué puedo compilar programas usando size_t type?

+0

Pruebe un grep recursivo: "grep -r" – Brady

+0

posible duplicado de [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' –

Respuesta

21

Usted puede tratar de ampliar incluir archivos con el preprocesador C (cpp) con la mano estándar y comprobar la salida de ese:

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

se dará cuenta de que la salida de cpp incluso incluye marcadores para indicar de qué archivos el código en stdlib-expanded.c ha sido incluido.

+2

+1 solo 'echo '#include ' | cpp -I/usr/include | grep size_t' da 'typedef long unsigned int size_t;' como primera línea – stijn

+0

gracias por su ayuda –

+0

echo '#include ' | cpp -I/usr/include | grep size_t HIZO EL TRUCO. ¡GRACIAS! – user2548100

3

Como otros escribieron, es probable que pueda encontrarlo si busca todos los archivos incluidos. Sin embargo, no está garantizado el hecho de que así es como funcionan la mayoría de las implementaciones.

La norma dice que, por ejemplo, #include <stddef.h> debe proporcionar una definición para size_t que debe ser un tipo de entero sin signo. Pero también dice que no es necesario que exista un archivo llamado stddef.h en cualquier parte del sistema de archivos. E incluso una aplicación que proporciona un archivo de este tipo, pero ese archivo sólo contiene la siguiente línea

#pragma stdlib_stddef_h 

sería perfectamente conforme si el pragma anterior proporciona efectivamente lo que prescribe la norma para esa cabecera.

En otras palabras, size_t es un tipo de entero sin signo porque eso es lo que dice el estándar, no porque eso es lo que puede leer en un archivo de encabezado.

3

Para completar, ¿ha considerado simplemente preguntar C++ sobre 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; 
} 

me da

sizeof(size_t) = 8 
is size_t an integer? yes 
is size_t signed? no 
5

gcc proporciona algunas de las cabeceras y que es relevante aquí: size_t se define en stddef.h que es una de las cabeceras. Aquí está, por ejemplo, en /usr/lib/x86_64-redhat-linux/4.1.1/include/stddef.h.Existe la definición de size_t es

typedef __SIZE_TYPE__ size_t; 

__SIZE_TYPE__ es una macro predefinida compilador (que permite asegurar que el compilador y el encabezado de acuerdo y, como lo que el compilador de espera dependerá de sus argumentos - por ejemplo, con -m32 se es un bit de 32 bits sin signo, y con -m64 un tipo de 64 bits sin signo -, para que el encabezado sea independiente de los argumentos del compilador).

Cuestiones relacionadas