ProgramlamaC geliştirici

C dilinde sabitleri tanımlamak için const ve #define arasındaki temel farkları anlatın. Hangi durumlardan ne amaçla her bir yaklaşımı kullanmalıyız, tipik hatalarla birlikte örnekler verin?

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

Cevap.

#define — bu, tüm tanımlayıcı buluşlarını derleme öncesinde değere değiştiren bir ön işleme direktifidir. Değişken oluşturmaz, türler hakkında bilgi sahibi değildir, sınırları kontrol etmez ve kapsamı dikkate almaz.

const — bu, gerçek bir değişken oluşturan bir nitelendiricidir, ancak başlatıldıktan sonra yazma işlemlerine kapalıdır. const değişkeninin bir türü, kapsamı vardır, hata ayıklamada yer alır ve daha güvenli olabilir. Bu tür değişkenler .rodata segmentinde veya yığını/ramde yer alır.

Ne zaman ve neden kullanmalıyız:

  • #define — derleme aşamasında ihtiyaç duyulan basit skalar değerler için, özellikle ön işleme koşullarında veya dizi boyutlarında (#define SIZE 16) kullanılır.
  • const — tür güvenli bir şekilde iletilecek, hata ayıklanacak ve güvenli bir şekilde dışa aktarılacak değerler için kullanılır (başlık dosyalarında, modüller arası).
  • Dize ve dizi işaretçileri için const kullanmak tercih edilir.

Örnek:

#define PI 3.14159 const double G = 9.81; int arr[PI]; // HATA! PI tamsayı değil int arr2[G]; // HATA! G derleme zamanı değeri değil

Kandırmaca soru.

Soru: const int a = 10; derleme zamanı sabiti olarak dizi oluşturmak için çalışır mı: int arr[a];?

Cevap: Hayır. C dilinde const bir nitelendiricidir, ancak değişken çalışma zamanında oluşturulur ve başlatılır, bu nedenle dizi boyutu bir literatür veya derleyici tarafından bilinen bir ifade olmalıdır. #define kullanın veya enum { SIZE = 10 }; kullanın.

Hata örneği:

const int a = 5; int arr[a]; // C89/90'da çalışmayacak (VLA'lar C99'da geldi, ama her yerde değil)

Hikaye

Medya sunucusunda const int kullanarak tampon boyutlarını belirlemeye çalıştılar, bunun "derleme zamanı sabiti" olduğunu düşündüler. Bir derleyicide (GCC, C99) her şey çalışıyordu, ancak çoğunda hata oluştu (VLA'lar desteklenmiyor), acilen #define ile yeniden yazdılar.


Hikaye

Platforma bağımlı bir kodda dizeyi #define NAME "MyApp" ile tanımladılar, birkaç yerde kullandılar ve parantezleri unuttular. Dizeye simgeler eklenince, belirgin parantezler olmadan yanlış sonuçlar aldı ve bu da loglardaki garip hatalara yol açtı.


Hikaye

Birden fazla modül içeren projede, aynı sabiti iki yerde farklı değerlerle #define ile tanımladılar (kopyala-yapıştır). Sonuç — modüller farklı sabitlerle çalıştı, verilerin doğruluğu ancak titiz hata ayıklama ile düzeltildi.