Makro (lebih tepatnya) lebih efisien, karena tidak melibatkan pemanggilan fungsi. Ini dapat dioptimalkan dengan lebih mudah, karena hanya melibatkan lookup offset offset.
Panggilan fungsi memungkinkan menghubungkan ke perpustakaan yang sama bahkan jika program dikompilasi tanpa definisi makro - jika dikompilasi dengan header yang berbeda, atau hanya dengan deklarasi nakal di dalam file sumber. Jika, misalnya, Anda memiliki kompiler yang memiliki versi "perbaikan" seseorang dari ctype.h yang tidak memiliki makro, fungsi tersebut akan tetap ada saat runtime untuk digunakan.
Jika kita melihat standarnya:
c99
7.1.4 Penggunaan fungsi perpustakaan
Setiap fungsi yang dideklarasikan dalam header dapat diimplementasikan sebagai makro mirip fungsi yang didefinisikan dalam header, jadi jika fungsi perpustakaan dideklarasikan secara eksplisit ketika headernya dimasukkan, salah satu teknik yang ditunjukkan di bawah ini dapat digunakan untuk memastikan deklarasi tidak dipengaruhi oleh makro seperti itu. Setiap definisi makro dari suatu fungsi dapat ditekan secara lokal dengan melampirkan nama fungsi dalam tanda kurung, karena nama tersebut kemudian tidak diikuti oleh tanda kurung kiri yang menunjukkan perluasan nama fungsi makro. Untuk alasan sintaksis yang sama, diizinkan untuk mengambil alamat fungsi pustaka bahkan jika itu juga didefinisikan sebagai makro.
Itu artinya jika Anda menulis:
int b = (isdigit)(c);
atau
int (*f)(int) = &isdigit;
int b = f(c);
maka Anda menjalankan fungsi yang sebenarnya, bukan makro. Anda juga dapat secara legal menulis:
#undef isdigit
int b = isdigit(c);
atau (dalam file sumber tidak memiliki #include <ctype.h>
secara langsung atau transitif):
extern int isdigit(int);
int b = isdigit(c);