Итак, я проходил через второе издание 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