Yanıtlar:
Visual Studio _DEBUG, /MTdveya /MDdseçeneğini belirttiğinizde tanımlar , NDEBUGstandart-C onaylarını devre dışı bırakır. Uygun olduğunda, yani bunları kullanın _DEBUGHata ayıklama kodu ile tutarlı olmak istiyorsanız , MS CRT hata ayıklama teknikleri ve NDEBUGsen tutarlı olmasını istiyorsanızassert() .
Kendi hata ayıklama makrolarınızı tanımlarsanız (ve derleyiciyi veya C çalışma zamanını hacklemezseniz), ayrılmış oldukları için adları alt çizgi ile başlatmaktan kaçının.
NDEBUG standart mı?
Evet, C89, C99, C ++ 98, C ++ 2003, C ++ 2011, C ++ 2014 standartları için anlamsal "Hata Ayıklama" özelliğine sahip standart bir makrodur. _DEBUGStandartlarda makro yoktur .
C ++ 2003 standardı okuyucuyu "17.4.2.1 Üstbilgiler" de "sayfa 326" da standart C'ye gönderir.
Bu NDEBUG, Standard C kitaplığıyla aynıdır.
C89'da (C programcıları bu standardı standart C olarak adlandırdılar) "4.2 TANILAMA" bölümünde söylendi
http://port70.net/~nsz/c/c89/c89-draft.html
NDEBUG, kaynak dosyada bulunan noktada bir makro adı olarak tanımlanırsa, onaylama makrosu basitçe şu şekilde tanımlanır:
#define assert(ignore) ((void)0)
_DEBUGVisual Studio https://msdn.microsoft.com/en-us/library/b0084kay.aspx içindeki makroların
anlamına bakarsanız,
bu makro otomatik olarak dil çalışma zamanı kitaplığı sürümünüz tarafından tanımlanır.
Güveniyorum NDEBUG, çünkü davranışları derleyiciler ve uygulamalar arasında standartlaştırılmış olan tek şey budur (standart iddia makrosu için belgelere bakın). Negatif mantık, küçük bir okunabilirlik hız darbesidir, ancak hızlı bir şekilde adapte olabileceğiniz yaygın bir deyimdir.
Böyle bir şeye _DEBUGgüvenmek, belirli bir derleyici ve kütüphane uygulamasının bir uygulama detayına güvenmek olacaktır. Diğer derleyiciler aynı kuralı seçebilir veya seçmeyebilir.
Üçüncü seçenek, projeniz için kendi makronuzu tanımlamaktır, ki bu oldukça mantıklıdır. Kendi makronuza sahip olmanız, uygulamalar arasında taşınabilirlik sağlar ve hata ayıklama kodunuzu iddialardan bağımsız olarak etkinleştirmenizi veya devre dışı bırakmanızı sağlar. Genel olarak, derleme zamanında etkinleştirilen farklı hata ayıklama bilgisi sınıflarına sahip olmamaya dikkat etmeliyim, çünkü muhtemelen küçük faydalar için inşa etmeniz (ve test etmeniz) gereken yapılandırma sayısında bir artışa neden olur.
Bu seçeneklerden herhangi birinde, projenizin bir parçası olarak üçüncü taraf kodu kullanırsanız, hangi sözleşmeyi kullandığını bilmeniz gerekir.
#if !defined(NDEBUG)<- @HostileFork demek istediğin bu değil mi? #ifdeğil #ifdefmi?
#ifdef NDEBUG... ama sonra negatif mantığa özel dikkat çekmek #if !defined(NDEBUG). Aksi takdirde n yakalamak için biraz zor #ifndef NDEBUG"
Makro, ifadelerin etkin NDEBUGolup olmadığını kontrol eder assert().
Benim görüşüme göre, bu diğer hata ayıklamalarından ayrıdır - bu yüzden NDEBUGprogramdaki hata ayıklama bilgilerini kontrol etmek dışında bir şey kullanıyorum . Kullandığım çerçeve, birlikte çalıştığım çerçeveye bağlı olarak değişir; farklı sistemlerin farklı etkinleştirici makroları vardır ve uygun olanı kullanırım.
Çerçeve yoksa, alt çizgi olmadan bir ad kullanırdım; bunlar 'uygulamaya' ayrılmaya eğilimlidirler ve isim çarpışmalarıyla ilgili sorunlardan kaçınmaya çalışırım - iki kez isim bir makro olduğunda.
#ifkontrol edilen kodu koymakla aynı şey değildir . assert(huge_object.IsValid());yavaş assert(ptr != nullptr);olmasa da yavaş olabilir . Jonathan'la oturum açmanın ve izlemenin muhtemelen en azından daha büyük projelerde iddialardan farklı olması gerektiğine katılıyorum , ancak günlüğe kaydetme veya izlemeyi hata ayıklama kodu olarak düşünmüyorum , bu yüzden açıklama istedim.
Ne yazık ki DEBUGaşırı yüklendi. Örneğin, RELEASE sürümleri için her zaman bir pdb dosyası oluşturmanız ve kaydetmeniz önerilir. Bu, -Zxbayraklardan biri ve -DEBUGbağlayıcı seçeneği anlamına gelir . Iken ve _DEBUGgibi çağrı zamanı kitaplığının özel hata ayıklama sürümleri ile ilgilidir . Ardından iddiaları devre dışı bırakır.mallocfreeNDEBUG