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:
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.
Ş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ı:
SQUARE makrosu tam parantezler ile yazıldı: #define SQUARE(x) ((x)*(x)). Kullanımı standartlaştırıldı ve belgelenmiştir.
Artıları: