Sorularınıza cevap vermek için, ağırlıklı olarak hangi makroların kullanıldığını düşünün (Uyarı: beyin-derlenmiş kod).
- Sembolik sabitleri tanımlamak için kullanılan makrolar
#define X 100
Bu kolayca değiştirilebilir: const int X = 100;
- Satır içi tip-agnostik fonksiyonları tanımlamak için kullanılan makrolar
#define max(X,Y) (X>Y?X:Y)
Fonksiyon aşırı yüklenmesini destekleyen herhangi bir dilde, bu doğru tipte aşırı yüklenmiş fonksiyonlara sahip olmak veya jenerikleri jenerik bir fonksiyonla destekleyen bir dilde çok daha güvenli bir şekilde taklit edilebilir. Makro mutlu karşılaştırmak dener şey derlemek olabilir işaretçiler veya dizeleri dahil, fakat ne istediğini hemen hemen kesinlikle değil. Öte yandan, makroları güvenli hale getirdiyseniz, aşırı yüklenmiş işlevler üzerinde hiçbir fayda veya kolaylık sağlamazlar.
- Makrolar, sık kullanılan öğelere kısayolları belirtmek için kullanılır.
#define p printf
Bu kolayca p()
aynı şeyi yapan bir işlev ile değiştirilir . Bu, C ( va_arg()
işlev ailesini kullanmanızı gerektiren) ile oldukça ilgilidir, ancak değişken sayıdaki işlev argümanlarını destekleyen birçok dilde, çok daha basittir.
Bu özellikleri Destekleme içinde oldukça özel bir makro dilinde daha dile basit, daha az hata eğilimli ve çok daha az kod okuma başkalarına kafa karıştırıcı olduğunu. Aslında, başka bir şekilde kolayca çoğaltılamayan makrolar için tek bir kullanım durumu düşünemiyorum . Sadece onlar gibi koşullu derleme yapılara bağlı olduğunda makro gerçekten yararlıdır yerdir #if
(vs.).
Bu noktada, sizinle tartışmayacağım, çünkü popüler dillerde koşullu derlemeye önişlemci olmayan çözümlerin son derece hantal olduğunu düşünüyorum (Java'da bytecode enjeksiyonu gibi). Ancak, D gibi diller, bir önişlemci gerektirmeyen ve ön-işlemsel koşullama kullanmaktan ziyade hantal olmayan, çok daha az hataya eğilimli olan çözümler üretti.