Где стандартный ввод определен в стандартной библиотеке c?

Я нашел эту строку в stdio.h:

extern struct _IO_FILE *stdin;

Основываясь на этом ключевом слове extern, я предполагаю, что это просто декларация. Интересно, где определяется и инициализируется стандартный ввод?

5 ответов

Решение

Это определено в исходном коде вашей библиотеки 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 и, конечно, от платформы. Если вы хотите, вы можете продолжить погоню за различными частями компонента ввода / вывода вашей стандартной библиотеки.

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

С11 7.21.1

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

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

STDERR
STDIN
стандартный вывод

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

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

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

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

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

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

Другие вопросы по тегам