I found this line in stdio.h :
extern struct _IO_FILE *stdin;
Based on this 'extern' keyword, i assume this is just a declaration. I wonder where is stdin defined and initialized?
I found this line in stdio.h :
extern struct _IO_FILE *stdin;
Based on this 'extern' keyword, i assume this is just a declaration. I wonder where is stdin defined and initialized?
The C standard explicitly states that
stdin
is a macro defined instdio.h
. It is not allowed to be defined anywhere else.C11 7.21.1
This macro can of course point at implementation details that are implemented elsewhere, such as in a "stdio.c" or whatever the compiler library chose to put it.
It's defined in the source code of your C library. You typically only need the headers for compilation, but you can find the source code for many open-source standard libraries (like glibc).
In glibc, it's defined in
libio/stdio.c
as like this:Which is in turn defined using a macro in
libio/stdfiles.c
like this:The definition of the
DEF_STDFILE
macro varies depending on a few things, but it more or less sets up an appropriateFILE
struct using the file descriptor0
(which is standard input on Unix).The definition may (and of course does) vary depending on your C library, and certainly by platform. If you want, you can continue the goose chase around the various parts of your standard library's I/O component.
In the standard library code, where else? In a Linux machine around here it's in
libc.a:stdio.o
, found usingnm -o /usr/lib/libc.a | grep stdin | grep D
. If you want to read some code, see the GNU C Library.I believe it's defined in
stdio.c
which is compiled into inlibc
(on gnu based systems)The definition will be implementation dependent, as will where you find it. For me, on OSX 10.6, it's defined in stdio.h, as a FILE (a struct).
stdin is of the type _IO_FILE, a struct which is clearly defined somewhere, probably in stdio.h. If not, check in the header files included in stdio.h for a definition of _IO_FILE.