Makro jest (przypuszczalnie) bardziej wydajne, ponieważ nie wymaga wywołania funkcji. Można go łatwiej zoptymalizować, ponieważ wymaga tylko wyszukiwania przesunięcia wskaźnika.
Wywołanie funkcji pozwala na połączenie z tą samą biblioteką, nawet jeśli program został skompilowany bez definicji makra - jeśli został skompilowany z innym nagłówkiem lub tylko z nieuczciwą deklaracją w pliku źródłowym. Jeśli, na przykład, masz kompilator, który ma czyjąś „ulepszoną” wersję ctype.h, która nie ma makra, funkcja nadal istniałaby w czasie wykonywania do użycia.
Jeśli spojrzymy na standard:
c99
7.1.4 Korzystanie z funkcji bibliotecznych
Każda funkcja zadeklarowana w nagłówku może być dodatkowo zaimplementowana jako makro funkcyjne zdefiniowane w nagłówku, więc jeśli funkcja biblioteki zostanie zadeklarowana jawnie, gdy jej nagłówek jest uwzględniony, można zastosować jedną z technik pokazanych poniżej, aby upewnić się, że deklaracja nie jest dotknięte przez takie makro. Wszelkie definicje makr funkcji można lokalnie pominąć, umieszczając nazwę funkcji w nawiasach, ponieważ po nazwie nie występuje lewy nawias, który wskazuje na rozwinięcie nazwy funkcji makra. Z tego samego powodu składniowego dozwolone jest przyjmowanie adresu funkcji biblioteki, nawet jeśli jest ona również zdefiniowana jako makro.
Oznacza to, że jeśli napiszesz:
int b = (isdigit)(c);
lub
int (*f)(int) = &isdigit;
int b = f(c);
następnie wywołujesz rzeczywistą funkcję, a nie makro. Możesz również legalnie napisać:
#undef isdigit
int b = isdigit(c);
lub (w pliku źródłowym nieposiadającym #include <ctype.h>
bezpośrednio ani przejściowo):
extern int isdigit(int);
int b = isdigit(c);