ProgramlamaC geliştiricisi

C dilindeki değişkenler ve fonksiyonlar için static ve extern arasındaki farkı açıklayın. Görünürlük alanı modüllerin organizasyonunu nasıl etkiler?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

  • 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.
    • Bu tür bir fonksiyon/değişken, diğer kaynaklarda "gözükmez".
  • extern:

    • Başka bir modülde tanımlanmış bir fonksiyon/değişkeni bildirmek için kullanılır. Derleyiciye "bu değişken/fonksiyon başka bir yerde var" sinyalini verir.

Ö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.

Kandırmaca Soru

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.

Gerçek Hatalardan Örnekler


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.