4.3.4. Fonksiyonlar Ve extern
Değişkenler
Daha önce de bahsettiğimiz gibi, küresel bir
değişkenin etki alanı normalde tanımlanmış olduğu kaynak dosyanın sonuna kadar
olan kısımdır. Ancak, başka dosyalarda veya aynı dosyada fakat daha ileride
tanımlanmış bulunan küresel değişkenleri kullanmanın bir yolu vardır: Anlamlı
bir yerde extern
anahtar sözcüğünü ve arkasına
değişkenin bildirimini yazmanız gerekir. Bundan sonra, sanki orada
değişkeni tanımlamışsınız gibi onu istediğiniz gibi kullanabilirsiniz. Ancak,
diğer dosyalardan değişkenlere bu tür bir erişim sağlamak için, değişkenin
özgün tanımının static
olmaması gerekir.
Yukarıda anlatılan yöntemin kullanıldığı bir dosya topluluğunda
static
olmayan her küresel değişkenin tam
bir tane extern
olmayan tanımı ve
birtakım extern
bildirimleri
vardır. extern
kullanılmamış
(özgün
) tanım, değişken için bellekten bir bölgenin
ayrıldığı tek yerdir. Diğer bildirimler ise, bu değişkenin tanımının
başka bir yerde bulunduğunu, tipinin ise belirtildiği gibi olduğunu
derleyiciye anlatmak içindir. Diğer bir deyişle, extern
bildirimi değişken için yer ayrılmasına neden olmaz.
Doğal olarak, bir değişkenin özgün tanımıyla extern
bildirimlerinde farklı tiplerin belirtilmesi istenmeyen şeylerin oluşmasına
neden olabilir, onun için dikkatli davranmak gerekir. Eğer hem tanım
hem de bildirim aynı dosyada ise derleyici hatayı bulabilecektir, fakat
eğer farklı dosyalarda ise hata bulunamayacaktır.
Fonksiyonlar kendi dosyalarında daha yukarıda kalan bölümler
veya (eğer static
değillerse) başka
dosyalar tarafından kullanılabilirler. Böyle bir durumda, kullanılmadan önce,
kullanıldığı bloğun (içinde veya) dışında fonksiyonun bildirimi yapılmalıdır.
Böyle bir bildirimde, fonksiyonun dönüş tipi, adı, parantez içine alınarak
virgülle ayrılmış parametre tipleri ve noktalı virgül bulunur. Fonksiyonun
bloğu yazılmaz. Örnek:
#include <stdio.h> double cikar(double,double); /* Bu fonksiyon daha ileride bir yerde tanımlanmaktadır. */ int main (void) { double a; a = 3.2; printf("%f\n", cikar(a,2)); return 0; } double cikar (double x, double y) { return x-y; }
Yukarıdaki programda yazılan
bildirimi, başka bir dosyada veya bu dosyanın daha ileriki bölümlerinde iki
double cikar(double,double);
double
argüman kabul eden ve dönüş tipi
double
olan cikar
isminde bir
fonksiyonun bulunduğunu ve bu fonksiyon kullanılırken bu bilginin
dikkate alınması gerektiğini derleyiciye anlatır. Eğer bu satır
yazılmamış olsaydı, derleyici cikar
’ın gerçek tanımına
ulaştığında biri int
biri de
double
olan iki cikar
isminde
fonksiyon bulunduğunu düşünecek, bu da büyük bir hata olacaktı. Ayrıca,
bu bilgiyi kullanarak, derleyici 2
tamsayı argümanını fonksiyona
geçirirken double
’a dönüştürür.