где стандартный ввод определен в стандартной библиотеке c? - PullRequest
9 голосов
/ 02 августа 2011

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

extern struct _IO_FILE *stdin;

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

Ответы [ 5 ]

10 голосов
/ 02 августа 2011

Это определено в исходном коде вашей библиотеки 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 голосов
/ 22 ноября 2017

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

C11 7.21.1

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

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

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

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

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

0 голосов
/ 02 августа 2011

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

0 голосов
/ 02 августа 2011

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

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

0 голосов
/ 02 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...