Bir değişkenin kapsamı (scope), C'de o değişkenin kullanılabilir olduğu kod parçasını tanımlar. Tarihsel olarak, C dilinin ilk sürümlerinden beri, yerel ve küresel kapsamların desteklenmesi, programları yapılandırmayı, değişkenlerin yeniden tanımlanmasından kaynaklanan hata sayısını azaltmayı ve kodun okunabilirliğini artırmayı sağlamıştır.
Sorun: Kapsamın doğru bir şekilde anlaşılmaması ve kullanılması, değişkenlerin yanlışlıkla yeniden tanımlanması, kodun bakım ve ölçeklenebilirlikle ilgili zorluklar ve değişkenlerin belli belirsiz çalışmasıyla ilgili hatalar gibi durumların ortaya çıkmasına neden olabilir.
Çözüm: Farklı kapsamları doğru bir şekilde kullanmak: blok (küme parantezleri içinde), işlev kapsamı, dosya kapsamı (static ile) ve küresel. Bu, bir kod parçasının diğerlerini etkileme olasılığını en aza indirir ve yan etkilerin olasılığını azaltır.
Kod örneği:
int global_var = 10; void foo() { int block_var = 5; if (block_var > 3) { int inner_var = 2; printf("inner_var: %d\n", inner_var); } // inner_var burada mevcut değil - kendi bloğundan dışarıda }
Anahtar özellikler:
Başka bir işlevden yerel bir değişkene işaretçi ile erişmek mümkün mü?
Yalnızca değişkenin adresini döndürmek gerekiyorsa, örneğin bir işlevden yerel bir değişkenin adresini döndürmek, ancak bu, yerel değişkenin belleğinin işlev tamamlandıktan sonra yeniden yazılabileceği nedeniyle tanımsız davranışa yol açar.
Kod örneği:
int* bad_function() { int temp = 42; return &temp; // tehlikeli! }
Farklı kapsamlar içinde aynı isimde iki değişken tanımlandığında ne olur?
Gölgeleme (shadowing) kuralı geçerlidir: Tanımlandığı yere yakın olan değişken, bu isimdeki diğer tüm değişkenleri gizler.
Kod örneği:
int value = 100; // küresel void foo() { int value = 10; // yerel, küreseli gizler }
static belirleyicisinin değişkenin görünürlüğü üzerindeki etkisi nedir?
Eğer static bir değişken işlev içinde kullanılıyorsa, bu değişken yerel olur ve çağrılar arasında değerini korur (kapsam ömrü ve blok görünürlüğü). Eğer küresel bir değişken için static kullanılıyorsa, görünürlük mevcut dosya ile sınırlıdır (file scope).
Büyük bir projede tüm değişkenler küresel olarak tanımlanır. Birisi başka bir işlevden küresel bir değişkeni yanlışlıkla yeniden tanımladığında, program yalnızca belirli bir işlev çağırma sırası ile düzgün çalışmaz.
Artılar:
Eksiler:
Her işlev yalnızca yerel değişkenleri kullanır ve gerekli veriler işlev parametreleri aracılığıyla iletilir.
Artılar:
Eksiler: