Tanımlayıcıların görünürlük alanı, programda değişkenlerin, fonksiyonların veya diğer varlıkların nerelerde erişilebilir olduğunu belirleyen temel bir kavramdır. Görünürlük yönetimi sorunu, C'nin ilk uygulamalarından itibaren zengin bir geçmişe sahiptir; görünürlük alanlarının yanlış kullanımı, yeniden tanımlama, beklenmeyen davranışlar ve bağlama hataları ile ilgili zorlayıcı hatalara neden olmuştur.
C ilk başta küçük projeler için tasarlandı; bu nedenle tüm program bir dosya içinde yer alıyordu. Dilin evrimiyle birlikte, programın farklı bölümleri için değişkenlerin/fonksiyonların net bir şekilde ayrılması gerekliliği doğdu; bu da görünürlük alanlarının formalizasyonuna yol açtı: blok, dosya ve küresel.
Doğru bir görünürlük alanı olmadan, programın farklı bölümlerinde kullanılan değişkenlerin değerlerini yanlışlıkla değiştirebilir, isim çakışmaları ile karşılaşabilir veya programın yapısını kaybedebilirsiniz. "Gölge" değişkenler ve küresel tanımlamaların yerel olanlarla örtüşmesi gibi hatalar sıkça karşılaşılan hata nedenleridir.
C'de görünürlük alanları şöyle olabilir:
{ ... } içinde (örneğin bir fonksiyon veya döngüde) erişilebilir. Blok dışında, değişken "unutulur".Kod örneği:
#include <stdio.h> int global = 10; // küresel görünürlük alanı void foo() { int block_var = 5; // blok görünürlük alanı static int static_file_var = 0; // eğer bu static ise, dosya görünürlüğü printf("%d\n", block_var); } int main() { printf("%d\n", global); // küresel görünür foo(); // printf("%d\n", block_var); // hata: block_var görünmez return 0; }
Anahtar özellikler:
1. Eğer küresel bir değişken ve bir fonksiyon parametresi aynı adı taşıyorsa, fonksiyon içinde hangisi kullanılacaktır?
Fonksiyon, parametreye sahip olmaları nedeniyle küresel değişkeni gölgeler; bu nedenle fonksiyon içinde parametrenin değeri kullanılır. Küresel değişken, yalnızca farklı bir isimle erişilebilir (eğer gölgelenmemişse).
2. Fonksiyon içinde static ve fonksiyon dışında static: görünürlük alanı aynı mıdır?
Hayır! Fonksiyon içinde static (static local) olan bir değişken, çağrılar arasında değerini saklar ama yalnızca bu fonksiyonda görünür. Fonksiyon dışında static olan ise, değişkenin/fonksiyonun görünürlüğünü mevcut dosya ile sınırlar.
Kod örneği:
static int a = 0; // static dosya kapsamı void foo() { static int b = 0; // static yerel kapsam }
3. Küresel ile çakışan bir yerel değişken adı kullanabilir miyim?
Evet, ama bu mevcut blok içinde küresel olanın "gölgeleneceği" anlamına gelir. Bu, yanlış değerlere hatalı erişimden dolayı hatalara neden olabilir.
Kod örneği:
int var = 10; void f() { int var = 20; printf("%d", var); // 20 yazdırır, küresel görünmez }
Proje iki dosyaya bölünmüştür. Her iki dosyada aynı adla küresel değişkenler tanımlanmıştır; ancak bunlar static veya extern olarak tanımlanmamıştır. Bağlayıcı bir hata verir veya program beklenmedik değerlerle çalışır.
Artılar:
Eksiler:
Açıkça static ve extern kullanılır, değişkenler ayrı bir başlık dosyasına konulur ve adlandırma kuralları tanımlanır.
Artılar:
Eksiler: