C dilinde değişkenlerin farklı kapsamları olabilir: yerel (blok içinde), küresel (tüm dosyada) ve dosya içindeki kapsam (static). Kapsamların doğru yönetimi, işleyişin tahmin edilebilirliği ve isim çakışmalarını önlemek için önemlidir.
Tüm dosyanın fonksiyonlarında görünür, extern ile tanımlanmışsa tüm projede de görünür.
Bloka (örneğin, bir fonksiyon veya döngü) girişte oluşturulurlar. Tanım bloklarının dışındaki alanlarda görünmezler.
static int foo; — sadece mevcut dosya için geçerlidir.
Örnek:
static int counter = 0; // Sadece dosya içinde void increment() { int temp = 10; // yerel değişken ++counter; }
Eğer küresel ve yerel değişkenlerin aynı ismi varsa, fonksiyon içinde hangisi kullanılır ve neden?
Cevap: Yerel olanı kullanılır, çünkü yerel değişken, kendi kapsamı içinde küresel ismi "gölgelemiştir" (shadowing). Küresel değişken, yerel değişkenin tanımlandığı blok dışında erişilebilir durumdadır.
Örnek:
int value = 5; void foo() { int value = 10; printf("%d", value); // 10 yazdırır, 5 değil }
Hikaye
Hikaye
static belirtilmesi unutulmuş, bu da bağlantı (linking) sırasında isim çakışmalarına ve projenin farklı parçalarının derlenmesi sırasında tahmin edilemeyen hatalara yol açtı.Hikaye
Küresel değişkenlerin çoklu iş parçacıklı kodda uygun senkronizasyon olmadan kullanıldığı durumlarla karşılaşıldı. Belirsiz kapsam ve farklı iş parçacıklarındaki değer değişikliklerine dikkat edilmemesi, veri yarışlarına (data race) neden oldu.