Saya membaca 'The Standard C Library' oleh PJ Plauger yang sangat menarik. Buku ini menjelaskan tidak hanya bagaimana MENGGUNAKAN perpustakaan tetapi juga bagaimana itu diterapkan.
Saya telah selesai membaca ctype.h
bagian dan di header fungsi dinyatakan sebagai fungsi makro DAN. Sebagai contoh
int isdigit(int);
tetapi juga
#define isdigit(c) (_Ctype[(int)(c)] & _DI)
Saya tidak mengerti mengapa KEDUA digunakan?
Juga, jika saya mencoba membuat ulang ctype
tajuk dan implementasi kustom saya sendiri , saya hanya dapat mengkompilasi dengan sukses jika saya menghapus makro (komentar di luar define).
Aspek ini tidak benar-benar dijelaskan dalam buku ini. Bisakah seseorang tolong jelaskan?
Jawaban:
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:
Itu artinya jika Anda menulis:
atau
maka Anda menjalankan fungsi yang sebenarnya, bukan makro. Anda juga dapat secara legal menulis:
atau (dalam file sumber tidak memiliki
#include <ctype.h>
secara langsung atau transitif):sumber
extern int isdigit(int)
, misalnya.