Anda telah menulis beberapa kode. Ini berhasil. Namun sekarang Anda ingin menggunakan generator rand() atau rutinitas bubble_sort tersebut dalam proyek yang benar-benar berbeda. Copy-paste itu malas. Itu juga rapuh. Saat Anda memperbarui satu versi, Anda harus mencari setiap salinan kodenya.
Langkah profesional? Membangun perpustakaan.
Di ekosistem C, perpustakaan bukanlah kotak hitam ajaib. Itu hanya dua file yang memakai topi berbeda. Anda memerlukan file header (.h ) dan file sumber (.c ). Headernya memberi tahu seluruh dunia fungsi apa saja yang ada. File sumber benar-benar berfungsi.
Membangun Antarmuka: util.h
File header bertindak sebagai kontrak. Itu tidak mengandung logika. Ini berisi janji-janji. Konstanta, tipe, dan prototipe fungsi.
Buat file bernama util.h.
Kata kunci eksternal tersebut melakukan pekerjaan berat. Mereka memberi tahu kompiler, “Jangan mencari implementasinya di sini. Saya akan menemukannya nanti saat menautkan.” Jika Anda terjebak pada compiler lama yang mendahului standar C modern, hapus parameter dari bubble_sort. Kompiler lama pilih-pilih seperti itu.
Menyembunyikan Mesin: util.c
Sekarang untuk kode sebenarnya. Simpan ini sebagai util.c.
Perhatikan direktif include. Kami menggunakan tanda kutip ("util.h" ) sebagai pengganti tanda kurung siku ( ). Perbedaan itu penting. Kutipan lihat di direktori Anda saat ini. Tanda kurung sudut lihat di direktori sistem. File ini bersifat lokal. Itu miliknya di sini.
Inilah bagian halusnya: rand_seed. Itu terletak di util.c. Ini tidak di util.h. Ini adalah informasi yang disembunyikan dalam tindakan. Kode yang menggunakan pustaka ini dapat memanggil rand(), tetapi tidak dapat menyentuh seed secara langsung. Negara dienkapsulasi. Untuk penegakan yang ketat, Anda dapat menambahkan kata kunci statis di depan definisi variabel. Itu menguncinya dengan rapat. Tidak ada akses eksternal. Periode.
Menggunakan Perpustakaan: main.c
Sekarang, tulis program yang menggunakannya. Simpan ini sebagai main.c.
Lebih pendek? Ya. Pembersih? Sangat. Program utama tidak peduli bagaimana rand() menghasilkan angka. Itu hanya menuntut sejumlah. Pemisahan itulah inti keseluruhannya.
Kompilasi dan Menghubungkan
Bagaimana Anda mengubah file terpisah ini menjadi file executable yang sedang berjalan? Anda mengikuti tarian tiga langkah.
Pertama, kompilasi sumber perpustakaan ke dalam file objek. Dengan asumsi Anda menggunakan sistem mirip UNIX menggunakan GCC:
Bendera -c tidak dapat dinegosiasikan di sini. Ini memberitahu kompiler untuk berhenti setelah memproduksi file objek. Ini menciptakan util.o. File ini berisi kode mesin, tetapi tidak lengkap. Ia tidak memiliki fungsi utama. Itu tidak bisa berjalan sendiri. Itu adalah komponen, bukan produk.
Selanjutnya, kompilasi program utama Anda:
Ini menghasilkan main.o. Sekali lagi, hanya kode mesin. Masih terjebak tanpa logika perpustakaan.
Terakhir, hubungkan keduanya.
Perintah ini mengambil kedua file objek dan menggabungkannya menjadi satu file executable bernama main. Sekarang Anda memiliki program yang lengkap. Jalankan dengan ./main (atau hanya main jika Anda menggunakan Windows atau memilikinya di jalur Anda).
Banyak langkah untuk dua fungsi. Tapi bayangkan melakukan ini untuk proyek dengan lima puluh file. Anda mengkompilasi setiap file .c satu kali. Anda menghubungkannya bersama-sama. Ubah fungsi di perpustakaan? Kompilasi ulang hanya file itu. Tautan ulang. Sisanya tetap tidak tersentuh.
Makefiles mengotomatiskan ini

























