C++ derleyicinizin bunları desteklediğini varsayarsak, günlük kaydı ve hata ayıklama amacıyla __FILE__
, __LINE__
ve __FUNCTION__
kullanmamak için *özel bir neden var mı?
Ben öncelikle kullanıcıya yanıltıcı veriler vermekten - örneğin, optimizasyon sonucunda yanlış satır numarası veya işlev bildirmekten - veya sonuç olarak bir performans darbesi almaktan endişe duyuyorum.
Temel olarak, __FILE__
, __LINE__
ve __FUNCTION__
'ın her zaman doğru şeyi yapacağına güvenebilir miyim?
FUNCTIONstandart değildir,
funcC99 / C++11'de mevcuttur. Diğerleri (
LINEve
FILE__`) gayet iyidir.
Her zaman doğru dosya ve satırı (ve __FUNCTION__
/__func__
kullanmayı seçerseniz işlevi) bildirecektir. Optimizasyon, derleme zamanı makro genişletmesi olduğu için bir faktör değildir; performansı hiçbir şekilde etkilemeyecektir.
Nadir durumlarda, __LINE__
tarafından verilen satırı başka bir şeyle değiştirmek yararlı olabilir. GNU configure'un, orijinal kaynak dosyalarında görünmeyen satırlar arasına bazı voodoo'lar ekledikten sonra uygun satır numaralarını bildirmek için bazı testler için bunu yaptığını gördüm. Örneğin:
#line 100
Aşağıdaki satırların __LINE__
100 ile başlamasını sağlayacaktır. İsteğe bağlı olarak yeni bir dosya adı ekleyebilirsiniz
#line 100 "file.c"
Sadece nadiren işe yarar. Ancak ihtiyaç duyulursa, bildiğim bir alternatif yok. Aslında, satır yerine, yukarıdaki iki formdan herhangi biriyle sonuçlanması gereken bir makro da kullanılabilir. boost önişlemci kütüphanesini kullanarak, geçerli satırı 50 artırabilirsiniz:
#line BOOST_PP_ADD(__LINE__, 50)
LINEve
FILE__` kullanımını sorduğunuz için bundan bahsetmenin yararlı olacağını düşündüm. C++'dan asla yeterince sürpriz çıkmaz :)
Düzeltme: @Jonathan Leffler yorumlarda birkaç iyi kullanım örneği daha sunuyor:
gt; #line ile uğraşmak, kullanıcının C kodunda bildirilen hataları kullanıcının kaynak dosyasıyla aynı hizada tutmak isteyen ön işlemciler için çok kullanışlıdır. Yacc, Lex ve (bana daha yakın olan) ESQL/C önişlemcileri bunu yapar.
Şahsen, bunları hata ayıklama mesajları dışında herhangi bir şey için kullanmak konusunda isteksizim. Bunu yaptım, ancak bu tür bilgileri müşterilere veya son kullanıcılara göstermemeye çalışıyorum. Müşterilerim mühendis değil ve bazen bilgisayar konusunda bilgili değiller. Bu bilgileri konsola kaydedebilirim, ancak dediğim gibi, hata ayıklama derlemeleri veya dahili araçlar dışında isteksizce. Yine de sahip olduğunuz müşteri tabanına bağlı olduğunu düşünüyorum.