Qt içinde bir Q_ASSERT makrosu vardır. assert yerine <cassert>
kullanmanın avantajı nedir? Aynı belgeden,Neden Q_ASSERT yerine
cevap
Q_ASSERT
sözde standart assert
fonksiyonunu artırır özel bir assert makrosudur.
hata mesajı standart assert makrosu göre bazı platformlarda biraz daha iyi davranabilir qFatal()
tarafından ele alınır. Örneğin, Windows'da, Visual Studio hata ayıklayıcısını, yalnızca abort()
numaralı telefonu aramak yerine onaylama işleminin başarısız olduğu noktada tetikler.
Ayrıca Qt hata mesajı fonksiyonlarının çıktı yönlendirebilirsiniz böyle (qInstallMessageHandler() ile) özel mesaj işleyicisi için qFatal
olarak. Örneğin, hata mesajını bir dosyaya yönlendirmek faydalı olabilir.
Ayrıca Q_ASSERT
engelli olduğuna dikkat makro QT_NO_DEBUG
(assert
NDEBUG
olarak devre iken): Bu senin Qt ile ilgili kod ve geri kalanı arasında iddia ayırmak için kullanılabilir.
:
QT_NO_DEBUG derleme sırasında tanımlanmış olsaydı daha hiçbir şey yapmaz.
Yani, bunu düşünmek: Q_ASSERT
NDEBUG
yokluğunda bağlı değildir, assert
olduğu gibi. #ifndef NDEBUG
assert()
için herhangi bir şey yapmak için gereklidir ve aynı zamanda genellikle kullanıcı (ve muhtemelen kütüphane ..?) Kodundaki diğer genel hata ayıklama sadece şeyleri sınırlamak için kullanılır. ayrı bir makro kullanma
programı NDEBUG
eğer kabartmak edeceğiz ayıklama okunur şeylerle kod kalanını tanımsız NDEBUG
bırakarak ve böylece yük olmadan, sadece Qt ile ilgili şeyleri ayıklamak istediğiniz isteyenler için bir avantajdır tanımlı değil, özellikle assert()
s.
Yani, -DNDEBUG
ama ile derlemek olabilir değil-DQT_NO_DEBUG
sen bırakma modu semantik ile 'normal' şeyler derlemek ama hala Qt şeyler hata ayıklama uygulamak istiyorsa.
Karmaşık bir GUI uygulaması geliştirirken bu kesinlikle çok yararlıdır. Ben Qt kullanmıyorum (henüz?) Ama GTK +/gtkmm [... eminim var, ama henüz bakmadım ;-)] seçilmiş araç takımlarımda böyle şeyleri kullanmanın yararını görüyorum ;-)
Eğer dik bir teklifin tartışma ile iç içe geçmiş, burada bu konuda son animasyonlu tartışma hatırlama: ISO C++ Standard - Future Proposals › Exception stack trace information.Evet, farklı hata ayıklama tanımlarını fark ettim, daha fazla bir şey olup olmadığını merak ediyordum. Fakat bu olasılığa sahip olmak mantıklı. – Zitrax
Bir yan notda, özel assert makrolarının nasıl çalıştığı ve neden yararlı olduklarıyla ilgili daha ayrıntılı bir açıklama istiyorsanız, ellerinizi alın ** _Game Programming Gems_ içinde Steve Rabin tarafından daha fazla assert ** – Louen