2011-08-02 10 views

Respuesta

8

Se define en el código fuente de su biblioteca C. Normalmente solo necesita los encabezados para la compilación, pero puede encontrar el código fuente para muchas bibliotecas estándar de código abierto (como glibc).

En glibc, es definido en libio/stdio.c como así:

_IO_FILE *stdin = (FILE *) &_IO_2_1_stdin_; 

que a su vez define utilizando una macro en libio/stdfiles.c como esto:

DEF_STDFILE(_IO_2_1_stdin_, 0, 0, _IO_NO_WRITES); 

La definición de la DEF_STDFILE macro varía dependiendo en algunas cosas, pero establece más o menos una estructura FILE apropiada utilizando el descriptor de archivo 0 (que es una entrada estándar en Unix).

La definición puede (y por supuesto lo hace) variar dependiendo de su biblioteca C, y ciertamente por plataforma. Si lo desea, puede continuar la búsqueda de ganso alrededor de las diversas partes del componente de E/S de su biblioteca estándar.

0

En el código de biblioteca estándar, ¿dónde? En una máquina Linux por aquí está en libc.a:stdio.o, encontrado usando nm -o /usr/lib/libc.a | grep stdin | grep D. Si quiere leer algún código, vea el GNU C Library.

0

creo que se define en stdio.c que se compila en en libc (en sistemas basados ​​en GNU)

+2

¿por qué es esto downvoted? – Alan

0

La definición será dependiente de la implementación, al igual que cuando lo encuentras. Para mí, en OSX 10.6, está definido en stdio.h, como un ARCHIVO (una estructura).

stdin es del tipo _IO_FILE, una estructura que está claramente definida en alguna parte, probablemente en stdio.h. De lo contrario, compruebe los archivos de encabezado incluidos en stdio.h para obtener una definición de _IO_FILE.

+2

No, esa es la * declaración *. La * definición * está en el código fuente de la biblioteca C. –

+0

No sigo. Me parece que FILE se define en las líneas 132-163 de stdio.h en mi sistema, donde se especifican todos sus miembros. ¿Eso no constituye una definición para una estructura? – bcr

+1

@bcr: Define la estructura * tipo *. No define el * objeto * 'stdin'. –

0

El estándar C establece explícitamente que stdin es una macro definida en stdio.h. No está permitido definirlo en ningún otro lado.

C11 7.21.1

"La cabecera <stdio.h> define varias macros, ..."/-/

"Las macros son ..."/-/

stderr
entrada estándar
stdout

que son expresiones del tipo '' puntero a ARCHIVO '' que apuntan a los objetos ARCHIVOS asociados, respectivamente, con las secuencias estándar de error, entrada y salida.

Esta macro puede, por supuesto, apuntar a los detalles de implementación que se implementan en otro lugar, como en "stdio.c" o cualquiera que sea la biblioteca de compilación que elija para ponerlo.

Cuestiones relacionadas