Yanıtlar:
Visual Studio _DEBUG
, /MTd
veya /MDd
seçeneğini belirttiğinizde tanımlar , NDEBUG
standart-C onaylarını devre dışı bırakır. Uygun olduğunda, yani bunları kullanın _DEBUG
Hata ayıklama kodu ile tutarlı olmak istiyorsanız , MS CRT hata ayıklama teknikleri ve NDEBUG
sen 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. _DEBUG
Standartlarda 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)
_DEBUG
Visual 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 _DEBUG
gü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? #if
değil #ifdef
mi?
#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 NDEBUG
olup olmadığını kontrol eder assert()
.
Benim görüşüme göre, bu diğer hata ayıklamalarından ayrıdır - bu yüzden NDEBUG
programdaki 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.
#if
kontrol 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 DEBUG
aşırı yüklendi. Örneğin, RELEASE sürümleri için her zaman bir pdb dosyası oluşturmanız ve kaydetmeniz önerilir. Bu, -Zx
bayraklardan biri ve -DEBUG
bağlayıcı seçeneği anlamına gelir . Iken ve _DEBUG
gibi çağrı zamanı kitaplığının özel hata ayıklama sürümleri ile ilgilidir . Ardından iddiaları devre dışı bırakır.malloc
free
NDEBUG