Standart C Programlama Dili


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 tanimlanmaktadir. */

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 “double cikar(double,double);” bildirimi, başka bir dosyada veya bu dosyanın daha ileriki bölümlerinde iki 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.