Anda perlu membedakan antara dua konsep terpisah: definisi fungsi dan pernyataan simbol. "extern" adalah pengubah tautan, petunjuk ke kompiler tentang di mana simbol yang dirujuk sesudahnya didefinisikan (petunjuknya adalah, "tidak di sini").
Jika saya menulis
extern int i;
dalam cakupan file (di luar blok fungsi) dalam file C, maka Anda mengatakan "variabel dapat didefinisikan di tempat lain".
extern int f() {return 0;}
adalah deklarasi fungsi f dan definisi fungsi f. Definisi dalam hal ini mengesampingkan eksternal.
extern int f();
int f() {return 0;}
pertama adalah deklarasi, diikuti oleh definisi.
Penggunaan extern
salah jika Anda ingin mendeklarasikan dan sekaligus menentukan variabel cakupan file. Sebagai contoh,
extern int i = 4;
akan memberikan kesalahan atau peringatan, tergantung pada kompiler.
Penggunaan extern
berguna jika Anda secara eksplisit ingin menghindari definisi variabel.
Biarkan saya jelaskan:
Katakanlah file ac berisi:
#include "a.h"
int i = 2;
int f() { i++; return i;}
File ah meliputi:
extern int i;
int f(void);
dan file bc berisi:
#include <stdio.h>
#include "a.h"
int main(void){
printf("%d\n", f());
return 0;
}
Extern di header berguna, karena memberitahu compiler selama fase tautan, "ini adalah deklarasi, dan bukan definisi". Jika saya menghapus baris dalam ac yang mendefinisikan i, mengalokasikan ruang untuknya dan memberikan nilai padanya, program harus gagal dikompilasi dengan referensi yang tidak ditentukan. Ini memberi tahu pengembang bahwa ia telah merujuk ke variabel, tetapi belum mendefinisikannya. Jika di sisi lain, saya menghilangkan kata kunci "extern", dan menghapus int i = 2
baris, program masih mengkompilasi - saya akan didefinisikan dengan nilai default 0.
Variabel ruang lingkup file secara implisit didefinisikan dengan nilai default 0 atau NULL jika Anda tidak secara eksplisit memberikan nilai padanya - tidak seperti variabel blok-lingkup yang Anda nyatakan di bagian atas fungsi. Kata kunci eksternal menghindari definisi tersirat ini, dan dengan demikian membantu menghindari kesalahan.
Untuk fungsi, dalam deklarasi fungsi, kata kunci memang berlebihan. Deklarasi fungsi tidak memiliki definisi implisit.