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.