Yapıma benzeyecek bir makro arıyordum. Bazı başka amaçlar için yararlı olabilir"Makroda" makro C
with (lock(&x), unlock(&x)) {
...
}
: kullanım gibi bir şey olmalıdır.
bu makro ile geldi:
#define __with(_onenter, _onexit, v) \
for (int __with_uniq##v=1; __with_uniq##v > 0;)\
for (_onenter; __with_uniq##v > 0; _onexit) \
while (__with_uniq##v-- > 0)
#define _with(x, y, z) __with(x, y, z)
#define with(_onenter, _onexit) _with(_onenter, _onexit, __COUNTER__)
O gerektiğini, çünkü 3 iç içe döngüler vardır:
- Başlatma döngü sayacı (örn.
with (int fd=open(..), close(fd))
) - Kod bloğunun içine
break
izin verin.
Ben XV6 OS için kod üzerinde kullandım ve oldukça kullanışlı görünüyor (continue
çok izin verilir. Ve makro assert()
bunu dışarı değiştirilebileceğini).
Sorum şu: bu tür bir makroyla ilgili en büyük sorun nedir? Yani, sadece bir C makrosunun kullanımı (özellikle yeni kontrol akışı yapısı uygulayan).
Şimdiye kadar bu dezavantajları/sorunlar olduğunu belirledik:
return
yagoto
(örneğinfd < 0
gibi) hataları için- desteği yok (ama çekirdek kodunda bazı
goto
s kaydedebilirsiniz) desteği yok. Bence bu tamir edilebilir. - gnu89/c99 ve sadece üstü (döngü sayacı. Benzersiz değişken numarası gerekli değildir)
- Basit kilit açma işlevinden biraz daha az verimlidir. Bunun önemsiz olduğuna inanıyorum.
Başka sorunlarınız var mı? C benzer yapıyı uygulamak için daha iyi bir yolu var mı?
Oh. Sonunda cevabı ... Ben cleanup' 'bilmiyordum, teşekkür ederim - yararlıdır geliyor. Makro onun scariness yanında daha spesifik sorunlar, var mı? – Elazar
"İade" için destek eksikliği, işlevlerin ortasında "iade" ifadelerine karşı katı bir kodlama standardıyla çalışmadığınız sürece bir anlaşma kesicisi gibi görünüyor. Bir 'with' bloğunda bir' return' göze çarpmayan olmazdı ama çalışma anında hasara yol açıyor olacaktır. – pdw
Anlıyorum ve return' büyük bir sorundur 'konusunda hemfikir (böylece' cleanup' çok daha iyidir). Ama aynı şekilde katı kodlama standardı gerektirmiyor mu? Bu açıdan goto'nun avantajları nelerdir? – Elazar