2011-08-02 1 views

ответ

8

Он определен в исходном коде вашей библиотеки C. Обычно вам нужны заголовки для компиляции, но вы можете найти исходный код для многих стандартных библиотек с открытым исходным кодом (например, glibc).

В Glibc, это определено в libio/stdio.c, как например:

_IO_FILE *stdin = (FILE *) &_IO_2_1_stdin_; 

который в свою очередь определяется с помощью макроса в libio/stdfiles.c так:

DEF_STDFILE(_IO_2_1_stdin_, 0, 0, _IO_NO_WRITES); 

Определение DEF_STDFILE макро варьируется в зависимости на нескольких вещах, но он более или менее устанавливает подходящую структуру FILE, используя дескриптор файла 0 (который является стандартным входом в Unix).

Определение может (и конечно же) варьироваться в зависимости от вашей библиотеки C и, конечно же, от платформы. Если вы хотите, вы можете продолжить погоню за гусями вокруг различных частей компонента ввода-вывода вашей стандартной библиотеки.

0

В стандартном библиотечном коде, где еще? В Linux-машине здесь находится libc.a:stdio.o, найденный с использованием nm -o /usr/lib/libc.a | grep stdin | grep D. Если вы хотите прочитать некоторый код, см. Раздел GNU C Library.

0

Я считаю, что это определено в stdio.c который составляется в в libc (в системах на основе гну)

+2

Почему это запрещено? – Alan

0

Определение термина будет зависеть реализация, как будет, где вы найдете его. Для меня, в OSX 10.6, он определен в stdio.h, как FILE (struct).

stdin имеет тип _IO_FILE, структура, которая четко определена где-то, возможно, в stdio.h. Если нет, проверьте файлы заголовков, включенные в stdio.h, для определения _IO_FILE.

+2

Нет, это * объявление *. * Определение * находится в исходном коде библиотеки C. –

+0

Я не следую. Мне кажется, что FILE определен в строках 132-163 stdio.h в моей системе, где указаны все ее члены. Разве это не является определением для структуры? – bcr

+1

@bcr: Он определяет тип структуры *. Он не определяет * object * 'stdin'. –

0

В стандарте C явно указано, что stdin - это макрос, определенный в stdio.h. Нельзя определять где-либо еще.

C11 7.21.1

"Заголовок <stdio.h> определяет несколько макросов, ..."/-/

"Макросы ..."/-/

STDERR
STDIN
STDOUT

, которые являются выражениями типа '' указатель на FILE '', которые указывают на объекты FILE , связанные со стандартными потоками ошибок, ввода и вывода.

Этот макрос, конечно, может указывать на детали реализации, которые реализованы в другом месте, например, в «stdio.c» или независимо от того, что выбрала библиотека компилятора.