C dilinde değişkenlerin bellek alanı, verilerin nerede saklandığını, ne kadar süreyle erişilebilir olduğunu ve hangi kod alanlarının onlara erişebileceğini belirler. Tarihsel olarak, auto (yerel değişkenler için varsayılan olarak), static (çağrılar arasında değeri saklar, genellikle durum saklamak için kullanılır) ve extern (başka bir yerde tanımlanan bir değişkeni bildirir) anahtar kelimeleri, değişkenlerin görünürlük ve yaşam süresi üzerinde kontrol sağlamak için tanıtılmıştır.
Sorun — değişkenin nerede ve ne kadar süreyle yaşadığına dair yanlış anlamalar, erişim hatalarına, bellek sızıntılarına ve okunması zor koda yol açabilir. Örneğin, yerel bir static değişkenin her fonksiyon çağrısında yeniden oluşturulmasını beklemek ya da tam tersine, bir auto değişkenin çağrılar arasında değer saklayacağını düşünmek yanlıştır.
Çözüm — her zaman bellek alanı belirleyicisini bilinçli bir şekilde seçmek ve sonuçlarını anlamaktır:
Kullanım örneği:
// main.c int global_var = 42; // varsayılan olarak static bellek alanına sahip, harici linkaj void func() { static int counter = 0; // çağrılar arasında yaşar auto int temp = 5; // yerel, auto belirtmek zorunda değiliz counter++; printf("call #%d\n", counter); } extern int global_var;
Anahtar özellikler:
Eğer değişkenler varsayılan olarak auto ise, neden auto yazmak gereksin?
C'nin modern sürümlerinde, auto anahtar kelimesi neredeyse açık bir biçimde kullanılmamaktadır — yerel bir değişken için bu varsayılan belirleyicidir. Genel olarak, açık bir şekilde yazılmasının hiçbir avantajı yoktur.
Fonksiyon içinde static kullanarak küresel bir değişken tanımlamak mümkün mü?
Cevap: Hayır, fonksiyon içinde static bir değişken tanımlamak, değişkeni yerel yapar ama çağrılar arasında durumu korur. Fonksiyon dışından görünmez.
Kod örneği:
void foo() { static int call_count = 0; // Küresel değil, ama çağrılar arasında kalmaya devam eder call_count++; }
Eğer bir değişkeni fonksiyon içinde extern olarak bildirirsem ama onu hiçbir yerde tanımlamazsam ne olur?
Cevap: Bu, bir bağlantı hatasına (linker error) yol açar çünkü var olmayan bir küresel değişkene referans bildirilmiştir.
Büyük bir projede, modül değişkenleri tüm kaynak dosyalarda extern olarak tanımlanmış ancak tanımlama kısmı unutulmuştu. Sonuç olarak — yeni başlayan geliştiriciler için belirsiz, gizemli bağlantı hataları oluştu.
Artıları:
Eksileri:
Görünürlük alanlarını sıkı bir şekilde belirlemişlerdi: her static değişken yalnızca gerekli modülde, küresel extern değişkenleri başlık dosyalarında bildirip tek yerde tanımlamışlardı.
Artıları:
Eksileri: