Понимание C встроенные реализации библиотечных функций

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

18
задан saint 11 July 2011 в 19:51
поделиться