Estoy leyendo 'The Standard C Library' de PJ Plauger, que es realmente interesante. El libro explica no solo cómo USAR la biblioteca sino también cómo se implementa.
He terminado de leer la ctype.h
sección y en el encabezado las funciones se declaran como macros Y funciones. Por ejemplo
int isdigit(int);
pero también
#define isdigit(c) (_Ctype[(int)(c)] & _DI)
No entiendo por qué AMBOS se usan?
Además, si intento recrear mi propio ctype
encabezado e implementación personalizados, solo puedo compilar con éxito si elimino la macro (comente la definición).
Este aspecto no fue realmente explicado en el libro. ¿Alguien puede explicar?
Respuestas:
La macro es (supuestamente) más eficiente, ya que no implica una llamada a la función. Se puede optimizar más fácilmente, ya que solo implica una búsqueda de desplazamiento del puntero.
La llamada a la función permite vincular contra la misma biblioteca incluso si el programa se compiló sin la definición de macro, si se compiló con un encabezado diferente, o simplemente con una declaración falsa dentro del archivo fuente. Si, por ejemplo, tiene un compilador que tiene la versión "mejorada" de alguien de ctype.h que no tenía la macro, la función aún existiría en tiempo de ejecución para su uso.
Si nos fijamos en el estándar:
Eso significa que si escribes:
o
entonces está invocando la función real, no la macro. También puedes escribir legalmente:
o (en un archivo fuente que no tiene
#include <ctype.h>
directa o transitivamente):fuente
extern int isdigit(int)
, por ejemplo.