Итак, я проходил второе и четвертое издание K & R. Чувствуя себя довольно уверенно после нескольких упражнений, я решил проверить фактические реализации этих функций. Тогда моя уверенность сбежала с места. Я не мог понять ничего из этого.
Например, я проверяю getchar()
:
Вот прототип в libio/stdio.h
extern int getchar (void);
Итак, я следую за ним и получаю следующее:
__STDIO_INLINE int
getchar (void)
{
return _IO_getc (stdin);
}
Снова я следую за ним в libio/getc.c
:
int
_IO_getc (fp)
FILE *fp;
{
int result;
CHECK_FILE (fp, EOF);
_IO_acquire_lock (fp);
result = _IO_getc_unlocked (fp);
_IO_release_lock (fp);
return result;
}
И я попал в другой заголовочный файл libio/libio.h
, который довольно загадочен:
#define _IO_getc_unlocked(_fp) \
(_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \
? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++)
Вот где я, наконец, закончил свое путешествие.
Мой вопрос довольно широк. Что все это значит? Я не мог для жизни меня понять что-то логичное из этого, глядя на код. Похоже, что куча кодов отвлекла слои после слоя.
Что еще важнее, когда он действительно получает символ от stdin