Где стандартный ввод определен в стандартной библиотеке 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.