A macro é (putativamente) mais eficiente, pois não envolve uma chamada de função. Ele pode ser otimizado mais facilmente, pois envolve apenas uma pesquisa de deslocamento do ponteiro.
A chamada de função permite vincular a mesma biblioteca, mesmo que o programa tenha sido compilado sem a definição de macro - se ele foi compilado com um cabeçalho diferente ou apenas com uma declaração não autorizada dentro do arquivo de origem. Por exemplo, se você tiver um compilador com a versão "aprimorada" de ctype.h de alguém que não possui a macro, a função ainda existiria no tempo de execução para uso.
Se olharmos para o padrão:
c99
7.1.4 Uso de funções da biblioteca
Qualquer função declarada em um cabeçalho pode ser implementada adicionalmente como uma macro de função definida no cabeçalho, portanto, se uma função de biblioteca for declarada explicitamente quando seu cabeçalho for incluído, uma das técnicas mostradas abaixo pode ser usada para garantir que a declaração não seja afetado por essa macro. Qualquer definição de macro de uma função pode ser suprimida localmente, colocando o nome da função entre parênteses, porque o nome não é seguido pelo parêntese esquerdo que indica a expansão de um nome de função de macro. Pela mesma razão sintática, é permitido usar o endereço de uma função de biblioteca, mesmo que ela também seja definida como uma macro.
Isso significa que se você escrever:
int b = (isdigit)(c);
ou
int (*f)(int) = &isdigit;
int b = f(c);
então você está invocando a função real, não a macro. Você também pode escrever legalmente:
#undef isdigit
int b = isdigit(c);
ou (em um arquivo de origem que não tenha #include <ctype.h>
direta ou transitivamente):
extern int isdigit(int);
int b = isdigit(c);