Así que estaba pasando por K & R segunda edición haciendo los ejercicios. Sintiéndome bastante seguro después de hacer algunos ejercicios, pensé que verificaría las implementaciones reales de estas funciones. Fue entonces cuando mi confianza huyó de la escena. No pude entender nada de eso.Comprensión de las implementaciones de función de biblioteca C integradas
Por ejemplo puedo comprobar el getchar()
:
Aquí es el prototipo en libio/stdio.h
extern int getchar (void);
Así lo sigo a través de él y obtiene la siguiente:
__STDIO_INLINE int
getchar (void)
{
return _IO_getc (stdin);
}
Una vez más lo sigo a el 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;
}
Y me llevan a otro archivo de cabecera libio/libio.h
, que es bastante críptica:
#define _IO_getc_unlocked(_fp) \
(_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \
? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++)
que es donde finalmente terminé mi viaje.
Mi pregunta es bastante amplia. ¿Qué significa todo esto? Por el resto de mi vida, no podría deducir nada lógico mirando el código. Parece un grupo de códigos abstraídos capas tras capa.
Más importante aún, cuando es lo que realmente obtener el carácter de stdin
se lee el carácter cuando se llama '__uflow()'. –