Bertahun-tahun kemudian, saya menemukan pertanyaan ini. Setelah membaca setiap jawaban dan komentar, saya pikir saya bisa mengklarifikasi beberapa detail ... Ini bisa berguna bagi orang-orang yang datang ke sini melalui pencarian Google.
Pertanyaannya secara khusus tentang penggunaan fungsi "eksternal", jadi saya akan mengabaikan penggunaan "eksternal" dengan variabel global.
Mari kita tentukan 3 prototipe fungsi:
//--------------------------------------
//Filename: "my_project.H"
extern int function_1(void);
static int function_2(void);
int function_3(void);
File header dapat digunakan oleh kode sumber utama sebagai berikut:
//--------------------------------------
//Filename: "my_project.C"
#include "my_project.H"
void main(void){
int v1 = function_1();
int v2 = function_2();
int v3 = function_3();
}
int function_2(void) return 1234;
Untuk mengkompilasi dan menautkan, kita harus mendefinisikan "function_2" dalam file kode sumber yang sama tempat kita memanggil fungsi itu. Dua fungsi lainnya dapat didefinisikan dalam kode sumber yang berbeda " .C" atau mereka dapat ditemukan di file biner apa pun ( .OBJ, * .LIB, * .DLL), yang mungkin tidak memiliki kode sumbernya.
Mari kita sertakan lagi header "my_project.H" dalam file "* .C" yang berbeda untuk lebih memahami perbedaannya. Dalam proyek yang sama, kami menambahkan file berikut:
//--------------------------------------
//Filename: "my_big_project_splitted.C"
#include "my_project.H"
void old_main_test(void){
int v1 = function_1();
int v2 = function_2();
int v3 = function_3();
}
int function_2(void) return 5678;
int function_1(void) return 12;
int function_3(void) return 34;
Fitur penting untuk diperhatikan:
Ketika suatu fungsi didefinisikan sebagai "statis" dalam file header, kompiler / linker harus menemukan contoh fungsi dengan nama itu di setiap modul yang menggunakan file yang menyertakan itu.
Fungsi yang merupakan bagian dari pustaka C dapat diganti hanya dalam satu modul dengan mendefinisikan ulang prototipe dengan "statis" hanya dalam modul itu. Misalnya, ganti panggilan apa pun ke "malloc" dan "gratis" untuk menambahkan fitur deteksi kebocoran memori.
Specifier "extern" sebenarnya tidak diperlukan untuk fungsi. Ketika "statis" tidak ditemukan, suatu fungsi selalu dianggap "eksternal".
Namun, "extern" bukan default untuk variabel. Biasanya, setiap file header yang mendefinisikan variabel agar terlihat di banyak modul perlu menggunakan "extern". Satu-satunya pengecualian adalah jika file header dijamin akan disertakan dari satu dan hanya satu modul.
Banyak manajer proyek kemudian mengharuskan variabel tersebut ditempatkan di awal modul, bukan di dalam file header apa pun. Beberapa proyek besar, seperti emulator permainan video "Mame" bahkan mengharuskan variabel tersebut hanya muncul di atas fungsi pertama yang menggunakannya.