La macro est (putativement) plus efficace, car elle n'implique pas d'appel de fonction. Il peut être optimisé plus facilement, car il implique simplement une recherche de décalage de pointeur.
L'appel de fonction permet de créer des liens avec la même bibliothèque même si le programme a été compilé sans la définition de macro - s'il a été compilé avec un en-tête différent, ou simplement avec une déclaration non autorisée à l'intérieur du fichier source. Si, par exemple, vous avez un compilateur qui a la version "améliorée" de quelqu'un de ctype.h qui n'avait pas la macro, la fonction existerait toujours au moment de l'exécution pour être utilisée.
Si nous regardons la norme:
c99
7.1.4 Utilisation des fonctions de bibliothèque
Toute fonction déclarée dans un en-tête peut en outre être implémentée en tant que macro de type fonction définie dans l'en-tête, donc si une fonction de bibliothèque est déclarée explicitement lorsque son en-tête est inclus, l'une des techniques indiquées ci-dessous peut être utilisée pour garantir que la déclaration n'est pas affecté par une telle macro. Toute définition de macro d'une fonction peut être supprimée localement en plaçant le nom de la fonction entre parenthèses, car le nom n'est pas suivi de la parenthèse gauche qui indique l'expansion d'un nom de macro fonction. Pour la même raison syntaxique, il est permis de prendre l'adresse d'une fonction de bibliothèque même si elle est également définie comme macro.
Cela signifie que si vous écrivez:
int b = (isdigit)(c);
ou
int (*f)(int) = &isdigit;
int b = f(c);
alors vous appelez la fonction réelle, pas la macro. Vous pouvez également légalement écrire:
#undef isdigit
int b = isdigit(c);
ou (dans un fichier source n'ayant pas #include <ctype.h>
directement ou transitivement):
extern int isdigit(int);
int b = isdigit(c);