assert
makro, _assert
, _wassert
Bir ifadeyi değerlendirir ve sonuç false
olduğunda bir tanılama iletisi yazdırır ve programı durdurur.
Sözdizimi
assert(
expression
);
void _assert(
char const* message,
char const* filename,
unsigned line
);
void _wassert(
wchar_t const* message,
wchar_t const* filename,
unsigned line
);
Parametreler
expression
Sıfır olmayan () veya 0false
( olarak değerlendirilen bir skaler ifade (true
işaretçi ifadeleri dahil).
message
Görüntülenecek ileti.
filename
Onaylama işleminin başarısız olduğu kaynak dosyanın adı.
line
Başarısız onaylama işleminin kaynak dosyasındaki satır numarası.
Açıklamalar
Makro assert
genellikle program geliştirme sırasında mantık hatalarını tanımlamak için kullanılır. Yalnızca program yanlış çalıştığında değerlendirilecek bağımsız değişkenini expression
uygulayarak beklenmeyen koşullar oluştuğunda program yürütmesini durdurmak için false
kullanın. Onay denetimleri, makro NDEBUG
tanımlanarak derleme zamanında kapatılabilir. Komut satırı seçeneğini kullanarak /DNDEBUG
kaynak dosyalarınızı değiştirmeden makroyu kapatabilirsinizassert
. Daha önce <assert.h>
dahil edilen assert
bir #define NDEBUG
yönergeyi kullanarak kaynak kodunuzda makroyu kapatabilirsiniz.
Makro, assert
(0) olarak değerlendirildiğinde expression
bir tanılama iletisi yazdırır false
ve program yürütmeyi durdurmak için çağırır abort
. Ise expression
true
(sıfır olmayan) hiçbir işlem yapılmaz. Tanılama iletisi başarısız ifadesini, kaynak dosyanın adını ve onay işleminin başarısız olduğu satır numarasını içerir.
Tanılama iletisi geniş (wchar_t
) karakterlerle yazdırılır. Bu nedenle, ifadede Unicode karakterleri olsa bile beklendiği gibi çalışır.
Tanılama iletisinin hedefi, yordamı çağıran uygulamanın türüne bağlıdır. Konsol uygulamaları iletiyi aracılığıyla stderr
alır. Windows tabanlı bir uygulamada, assert
Windows MessageBox
işlevini çağırarak iletiyi üç düğmeyle görüntülemek üzere bir ileti kutusu oluşturur: İptal Et, Yeniden Dene ve Yoksay. Kullanıcı Durdur'u seçerse, program hemen iptal eder. Kullanıcı Yeniden Dene'yi seçerse hata ayıklayıcı çağrılır ve tam zamanında (JIT) hata ayıklama etkinleştirildiğinde kullanıcı programda hata ayıklayabilir. Kullanıcı Yoksay'ı seçerse, program normal yürütmeye devam eder. Bir hata koşulu mevcut olduğunda Yoksay'a tıklanması, çağıran kodun önkoşulları karşılanmadığından tanımsız davranışa neden olabilir.
Uygulama türünden bağımsız olarak varsayılan çıkış davranışını geçersiz kılmak için, output-to-stderr ile display-dialog-box davranışı arasında seçim yapmak için çağrısı _set_error_mode
yapın.
İletisini görüntüledikten sonraassert
, İptal, Yeniden Dene ve Yoksay düğmeleri içeren bir iletişim kutusu görüntüleyen öğesini çağırırabort
. abort
programdan çıkar, bu nedenle Yeniden Dene ve Yoksay düğmesi, çağrıdan sonra program yürütmeyi assert
sürdürmez. bir iletişim kutusu görüntülenirse assert
, abort
iletişim kutusu gösterilmez. İletişim kutusunun gösterildiği tek zaman abort
, assert
çıkışını stderr'a gönderdiği zamandır.
Yukarıdaki davranışın bir sonucu olarak, hata ayıklama modundaki bir çağrının ardından her zaman bir assert
iletişim kutusu görüntülenir. Her düğmenin davranışı aşağıdaki tabloda yakalanır.
Hata modu | Çıkış: stderr (Konsol/_OUT_TO_STDERR ) |
Görüntü İletişim Kutusu (Windows/_OUT_TO_MSGBOX ) |
---|---|---|
Abort |
Çıkış kodu 3 ile hemen çık | Çıkış kodu 3 ile hemen çık |
Retry |
Hata ayıklayıcıya giriş sırasında abort |
Hata ayıklayıcıya giriş sırasında assert |
Ignore |
Çıkış işlemini şu şekilde tamamlayın: abort |
Programa sanki tetiklenmemiş gibi assert devam edin (çağıran kodun önkoşulları karşılanmadığından tanımsız davranışa neden olabilir) |
CRT hata ayıklama hakkında daha fazla bilgi için bkz . CRT hata ayıklama teknikleri.
_assert
ve _wassert
işlevleri iç CRT işlevleridir. Onayları desteklemek için nesne dosyalarınızda gereken kodun en aza indirilmesine yardımcı olur. Bu işlevleri doğrudan çağırmanızı önermeyiz.
Makro assert
, tanımlanmadığında NDEBUG
C çalışma zamanı kitaplıklarının hem sürüm hem de hata ayıklama sürümlerinde etkinleştirilir. Tanımlandığında NDEBUG
, makro kullanılabilir, ancak bağımsız değişkenini değerlendirmez ve hiçbir etkisi yoktur. Etkinleştirildiğinde, assert
makro uygulamasını çağırır _wassert
. , ve _ASSERT_EXPR
diğer onay makroları _ASSERT
_ASSERTE
da kullanılabilir, ancak yalnızca makro tanımlandığında _DEBUG
ve C çalışma zamanı kitaplıklarının hata ayıklama sürümüyle bağlantılı kodda olduklarında kendilerine geçirilen ifadeleri değerlendirirler.
Gereksinimler
Yordam | Gerekli başlık |
---|---|
assert , _wassert |
<assert.h> |
İşlevin _assert
imzası üst bilgi dosyasında kullanılamaz. İşlevin _wassert
imzası yalnızca makro tanımlanmadığında NDEBUG
kullanılabilir.
Örnek
Bu programda analyze_string
işlev, dize ve uzunlukla ilgili çeşitli koşulları test etmek için makroyu kullanır assert
. Koşullardan herhangi biri başarısız olursa, program hataya neyin neden olduğunu belirten bir ileti yazdırır.
// crt_assert.c
// compile by using: cl /W4 crt_assert.c
#include <stdio.h>
#include <assert.h>
#include <string.h>
void analyze_string( char *string ); // Prototype
int main( void )
{
char test1[] = "abc", *test2 = NULL, test3[] = "";
printf ( "Analyzing string '%s'\n", test1 ); fflush( stdout );
analyze_string( test1 );
printf ( "Analyzing string '%s'\n", test2 ); fflush( stdout );
analyze_string( test2 );
printf ( "Analyzing string '%s'\n", test3 ); fflush( stdout );
analyze_string( test3 );
}
// Tests a string to see if it is NULL,
// empty, or longer than 0 characters.
void analyze_string( char * string )
{
assert( string != NULL ); // Cannot be NULL
assert( *string != '\0' ); // Cannot be empty
assert( strlen( string ) > 2 ); // Length must exceed 2
}
Program şu çıkışı oluşturur:
Analyzing string 'abc'
Analyzing string '(null)'
Assertion failed: string != NULL, file crt_assert.c, line 25
Onaylama hatasından sonra, işletim sisteminin ve çalışma zamanı kitaplığının sürümüne bağlı olarak şuna benzer bir ileti kutusu görebilirsiniz:
A problem caused the program to stop working correctly. Windows will close the program and notify you if a solution is available.
Bir hata ayıklayıcısı yüklüyse hata ayıklayıcıyı başlatmak için Hata Ayıkla düğmesini veya çıkmak için Programı kapat'ı seçin.
Ayrıca bkz.
Hata işleme
İşlem ve ortam denetimi
abort
raise
signal
_ASSERT
, _ASSERTE
, _ASSERT_EXPR
Makrolar
_DEBUG