static (dosya/modül düzeyinde):
static olarak tanımlanan değişkenler ve fonksiyonlar, görünürlük alanı yalnızca derlenen modül (dosya) ile sınırlıdır.extern:
Önemli: static — gerçekleştirmeyi gizlemek için, extern — modüller arasında bağ kurmak için.
Örnek:
main.c:
static int hidden_var = 5; extern int shared_var; int main() { printf("shared %d", shared_var); }
shared.c:
int shared_var = 10;
Başka bir dosyadan hidden_var kullanmaya çalışmak, bağlayıcı hatasına yol açacaktır.
Farklı modüllerde aynı adla ve farklı static/extern belirleyicileriyle bir değişken tanımlarsak ne olur?
Cevap: Her bir static değişken (örneğin, static int foo; farklı dosyalarda) tamamen bağımsız bir nesnedir. extern int foo; ifadesi, foo adıyla paylaşılmış bir global değişken arar. static ve extern karıştırılamaz — bu, bir dosyada foo static olarak tanımlanmışsa ve diğerinde extern olarak bildirilmişse, bağlama hatasına neden olur.
Hikaye Proje içerisinde farklı modüllerde aynı isimli fonksiyonların tekrarlandığı tespit edildi (static olmadan): bağlayıcı yalnızca bir tanesini bağladı, diğeri "kayboldu", bu durum uygulamanın mantığını etkiledi.
Hikaye Büyük bir projede, iki modülde global bir değişken
int counter;tanımlandı, her iki seferde de extern olmadan. Sonuç olarak, uygulamanın davranışı bağlantı sırasına bağlı hale geldi, bazen çakışan semboller ortaya çıktı.
Hikaye Bir modül hatalı görünürlük alanına sahip bir fonksiyonu kullandı: o, static olarak tanımlanmıştı ve geliştirici onu başka bir kaynaktan çağırmaya çalıştı — program, modifikatörü extern olarak değiştirmeden (veya static'i kaldırmadan) derlenmedi.