assert makro, _assert, _wassert

Bir ifadeyi değerlendirir ve sonuç falseolduğ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 (trueiş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 NDEBUGtanı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 stderralı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_EXPRdiğ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