Das Makro ist (mutmaßlich) effizienter, da es keinen Funktionsaufruf enthält. Es kann einfacher optimiert werden, da nur ein Zeiger-Offset-Lookup erforderlich ist.
Der Funktionsaufruf ermöglicht das Verknüpfen mit derselben Bibliothek, auch wenn das Programm ohne die Makrodefinition kompiliert wurde - wenn es mit einem anderen Header kompiliert wurde oder nur mit einer falschen Deklaration in der Quelldatei. Wenn Sie beispielsweise einen Compiler mit einer "verbesserten" Version von ctype.h haben, der kein Makro enthält, ist die Funktion zur Laufzeit noch verfügbar .
Wenn wir uns den Standard ansehen:
c99
7.1.4 Nutzung von Bibliotheksfunktionen
Jede in einem Header deklarierte Funktion kann zusätzlich als funktionsähnliches Makro implementiert werden, das in dem Header definiert ist. Wenn eine Bibliotheksfunktion also explizit deklariert wird, wenn ihr Header enthalten ist, kann eine der unten gezeigten Techniken verwendet werden, um sicherzustellen, dass die Deklaration nicht erfolgt von einem solchen Makro betroffen. Jede Makrodefinition einer Funktion kann lokal unterdrückt werden, indem der Name der Funktion in Klammern eingeschlossen wird, da auf den Namen keine linke Klammer folgt, die die Erweiterung eines Makrofunktionsnamens angibt. Aus dem gleichen syntaktischen Grund ist es zulässig, die Adresse einer Bibliotheksfunktion zu übernehmen, auch wenn diese auch als Makro definiert ist.
Das heißt, wenn Sie schreiben:
int b = (isdigit)(c);
oder
int (*f)(int) = &isdigit;
int b = f(c);
dann rufen Sie die eigentliche Funktion auf, nicht das Makro. Sie können auch legal schreiben:
#undef isdigit
int b = isdigit(c);
oder (in einer Quelldatei nicht #include <ctype.h>
direkt oder transitiv):
extern int isdigit(int);
int b = isdigit(c);