Değişkenlerin bildirilmesi ve başlatılması, oldukça katı ve bazen gözle görülmeyen kurallara sahip C dilinin temel taşını oluşturur. Bir değişkeni nasıl ve nerede bildirdiğinize bağlı olarak, başlangıç değeri (başlatma hakkında) ve bellek nesnesi ile bağlantı (bildirim ve tanım hakkında) büyük ölçüde etkilenecektir.
C, bellek optimizasyonunun öncelikli olduğu zamanlara dayanır. Geliştiriciler değişkenleri kendileri bildirmek ve başlatmak zorundaydılar; aksi takdirde programın davranışı tahmin edilemez hale gelirdi. Modern C derleyicilerinde en küçük bir sapma, bağlantı hatalarına veya belirsiz bir "çöp" ile otomatik başlatmaya neden olabilir.
Temel hatalar:
Kod örneği:
#include <stdio.h> int global_var; // tanım, otomatik başlatma = 0 static int static_global_var; // static-dosya, otomatik başlatma = 0 extern int extern_var; // bildirim, tanım başka bir yerde void foo() { int local_var; // otomatik, başlatılmamış -> çöp static int static_local_var; // static, otomatik olarak 0'a başlatıldı }
Anahtar özellikler:
1. Otomatik değişkenler (static ve extern olmayan yerel) derleyici tarafından otomatik olarak 0'a başlatılır mı?
Hayır, çöp içerir. Değerleri tanımlı değildir, başlangıçtan önce kullanmak hata olur.
2. Farklı dosyalarda extern ile bir değişken birden fazla kez tanımlanabilir mi?
Hayır, yalnızca bir tanım olmalı, diğerleri extern ile bildirim olmalıdır; aksi takdirde derleyici "çoklu tanım" veya "belirsiz sembol" hatası verir.
3. Bir fonksiyon bildirimi ile tanımı arasındaki fark nedir?
Bildirim - sadece prototip (gövdesiz); tanım - mutlaka fonksiyonun gövdesini içerir. Değişkenler için extern ile bildirim bellek ayırmazken, fonksiyonlar için her iki form da geçerlidir.
İki başlık dosyasında global değişken int counter; tanımlanıyor. Proje "çoklu tanım" hatasıyla bağlantılı olarak çözüldü.
Artılar:
Eksiler:
Başlık dosyasında extern int counter; tanımı, yalnızca bir C dosyasında int counter = 0; ile tanımlanmıştır.
Artılar:
Eksiler: