ProgramlamaC/Gömülü Geliştirici

C dilinde parametreli makrolar (fonksiyon benzeri makrolar) nasıl uygulanır ve kullanılır? Tanımlanması ve uygulanması sırasında hangi tuzaklar ortaya çıkıyor?

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

Cevap.

Konuya Giriş
Parametreli makrolar, C ön işleyicisinde önemli bir parçadır. Tekrar eden kod parçalarının hızlı entegrasyonu ve hata ayıklamanın basitleştirilmesi için ortaya çıktı. Küçük fonksiyonlar, inline veya optimizasyon için kullanılır.

Problemi
Makrolar türleri kontrol etmez ve yalnızca basit metin değişimi dışında tam yerleştirme yapmaz. Hatalar, parantezlerin eksikliği ve yan etkileri olan ifadelerin değiştirilmesi nedeniyle ortaya çıkar.

Çözüm
Parametreler ve makro tanımlarının etrafında parantez kullanmak, argümanlarda yan etki olmamasını sağlamak ve daha karmaşık durumlar için inline fonksiyonlardan yararlanmak.

Kod örneği:

#define MAX(a, b) ((a) > (b) ? (a) : (b)) int x = 5, y = 10; int z = MAX(x++, y++); // Tehlikeli çağrı!

Ana özellikler:

  • Derleme aşamasında tür kontrolü yapılmaz
  • Hataları önlemek için tüm parametrelerin parantez içinde alınması önerilir
  • Makrolar, ++, -- içeren karmaşık ifadelerde hata alabilir.

Kandırma Soruları.

Makro, her zaman bir fonksiyon gibi kodu tamamen değiştirir mi?

Hayır! Makro, derlemeden önce yalnızca bir metin yerleştirmesidir ve argümanlar yan etkili ifadeler ise fonksiyondan farklı davranabilir.

Bir makro parametresi olarak her çağrıyı (++ veya -- dahil) kullanabilir miyim?

Bu son derece tehlikeli. Eğer parametre makroda birden fazla kez kullanılıyorsa yan etkiler birden fazla kez gerçekleşecektir.

Kod örneği:

// Bu çağrı x veya y'yi 1'den fazla artırır MAX(x++, y++)

Makro tanımlarında parantezleri nasıl doğru bir şekilde dahil edebilirim?

Parantezleri, çağrıların içindeki hata önlemek için hem parametrelerin hem de makro içindeki ifadenin etrafına almak.

Yaygın Hatalar ve Anti-Desenler

  • Parametrelerin parantez içinde tutulmaması: #define MUL(a, b) a * b
  • Yan etkileri olan parametrelerin kullanılması
  • Aynı parametrenin birden fazla kez kullanımı ile makro

Gerçek Hayat Örneği

Olumsuz Durum

Şirket, uzun yıllar boyunca #define SQUARE(x) xx makrosunu tanımladı ve SQUARE(a+1) gibi ifadelerde kullandı. Beklenmedik hatalar ortaya çıktı: ifade a+1a+1 olarak yerleştiriliyordu, bu da (a+1)*(a+1) ile farklıdır.

Artıları:

  • Kısa makroları yazmak kolay ve hızlı Eksileri:
  • Yalnızca çalışma zamanında görülen hatalar
  • Karmaşık hata ayıklama

Olumlu Durum

SQUARE makrosu tam parantezler ile yazıldı: #define SQUARE(x) ((x)*(x)). Kullanımı standartlaştırıldı ve belgelenmiştir.

Artıları:

  • Hata yokluğu
  • Normal bir fonksiyon gibi davranıyor Eksileri:
  • Tür kontrolü yok
  • Eğer x++ verilirse, etki tekrar eder