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:
c99
7.1.4 Uso de funciones de biblioteca
Cualquier función declarada en un encabezado puede implementarse adicionalmente como una macro similar a una función definida en el encabezado, por lo que si una función de biblioteca se declara explícitamente cuando se incluye su encabezado, se puede usar una de las técnicas que se muestran a continuación para garantizar que la declaración no afectado por tal macro. Cualquier definición macro de una función puede suprimirse localmente encerrando el nombre de la función entre paréntesis, porque el nombre no es seguido por el paréntesis izquierdo que indica la expansión del nombre de una función macro. Por la misma razón sintáctica, se permite tomar la dirección de una función de biblioteca incluso si también se define como una macro.
Eso significa que si escribes:
int b = (isdigit)(c);
o
int (*f)(int) = &isdigit;
int b = f(c);
entonces está invocando la función real, no la macro. También puedes escribir legalmente:
#undef isdigit
int b = isdigit(c);
o (en un archivo fuente que no tiene #include <ctype.h>
directa o transitivamente):
extern int isdigit(int);
int b = isdigit(c);