assert makro, _assert, _wassert

Mengevaluasi ekspresi dan, ketika hasilnya adalah false, mencetak pesan diagnostik dan membatalkan program.

Sintaks

assert(
   expression
);
void _assert(
   char const* message,
   char const* filename,
   unsigned line
);
void _wassert(
   wchar_t const* message,
   wchar_t const* filename,
   unsigned line
);

Parameter

expression
Ekspresi skalar (termasuk ekspresi penunjuk) yang mengevaluasi ke nonzero (true) atau 0 (false).

message
Pesan yang akan ditampilkan.

filename
Nama file sumber tempat pernyataan gagal.

line
Nomor baris dalam file sumber pernyataan yang gagal.

Keterangan

assert Makro biasanya digunakan untuk mengidentifikasi kesalahan logika selama pengembangan program. Gunakan untuk menghentikan eksekusi program ketika kondisi tak terduga terjadi dengan menerapkan expression argumen untuk mengevaluasi false hanya ketika program beroperasi dengan tidak benar. Pemeriksaan pernyataan dapat dinonaktifkan pada waktu kompilasi dengan menentukan makro NDEBUG. Anda dapat menonaktifkan assert makro tanpa mengubah file sumber Anda dengan menggunakan /DNDEBUG opsi baris perintah. Anda dapat menonaktifkan assert makro dalam kode sumber Anda dengan menggunakan direktif #define NDEBUG sebelum <assert.h> disertakan.

assert Makro mencetak pesan diagnostik saat expression mengevaluasi ke false (0) dan memanggil abort untuk menghentikan eksekusi program. Tidak ada tindakan yang diambil jika expression ( true bukan nol). Pesan diagnostik mencakup ekspresi yang gagal, nama file sumber, dan nomor baris tempat pernyataan gagal.

Pesan diagnostik dicetak dalam karakter lebar (wchar_t). Oleh karena itu, ini akan berfungsi seperti yang diharapkan bahkan jika ada karakter Unicode dalam ekspresi.

Tujuan pesan diagnostik tergantung pada jenis aplikasi yang disebut rutinitas. Aplikasi konsol menerima pesan melalui stderr. Dalam aplikasi berbasis Windows, assert memanggil fungsi Windows MessageBox untuk membuat kotak pesan untuk menampilkan pesan dengan tiga tombol: Batalkan, Coba Lagi, dan Abaikan. Jika pengguna memilih Batalkan, program akan segera dibatalkan. Jika pengguna memilih Coba Lagi, debugger dipanggil, dan pengguna dapat men-debug program jika penelusuran kesalahan just-in-time (JIT) diaktifkan. Jika pengguna memilih Abaikan, program akan dilanjutkan dengan eksekusi normal. Mengklik Abaikan ketika ada kondisi kesalahan dapat mengakibatkan perilaku yang tidak ditentukan karena prasyarat kode panggilan tidak terpenuhi.

Untuk mengambil alih perilaku output default terlepas dari jenis aplikasi, panggil _set_error_mode untuk memilih antara perilaku output-ke-stderr dan kotak dialog tampilan.

Setelah assert menampilkan pesannya, pesan memanggil abort, yang menampilkan kotak dialog dengan tombol Batalkan, Coba Lagi, dan Abaikan . abortkeluar dari program, sehingga tombol Coba Lagi dan Abaikan tidak akan melanjutkan eksekusi program setelah assert panggilan. Jika assert menampilkan kotak dialog, kotak abort dialog tidak ditampilkan. Satu-satunya waktu kotak abort dialog ditampilkan, adalah saat assert mengirim outputnya ke stderr.

Sebagai konsekuensi dari perilaku di atas, kotak dialog selalu ditampilkan mengikuti assert panggilan dalam mode debug. Perilaku setiap tombol diambil dalam tabel di bawah ini.

Mode kesalahan Output ke stderr (Konsol/_OUT_TO_STDERR) Tampilkan Kotak Dialog (Windows/_OUT_TO_MSGBOX)
Abort Keluar segera dengan kode keluar 3 Keluar segera dengan kode keluar 3
Retry Masuk ke debugger selama abort Masuk ke debugger selama assert
Ignore Selesai keluar melalui abort Melanjutkan program seolah-olah assert tidak diaktifkan (dapat mengakibatkan perilaku yang tidak terdefinisi karena prasyarat kode panggilan tidak terpenuhi)

Untuk informasi selengkapnya tentang penelusuran kesalahan CRT, lihat teknik penelusuran kesalahan CRT.

Fungsi _assert dan _wassert adalah fungsi CRT internal. Mereka membantu meminimalkan kode yang diperlukan dalam file objek Anda untuk mendukung pernyataan. Kami tidak menyarankan Anda memanggil fungsi-fungsi ini secara langsung.

assert Makro diaktifkan dalam versi rilis dan debug pustaka run-time C saat NDEBUG tidak ditentukan. Ketika NDEBUG ditentukan, makro tersedia, tetapi tidak mengevaluasi argumennya dan tidak berpengaruh. Saat diaktifkan, assert makro memanggil _wassert implementasinya. Makro pernyataan lainnya, _ASSERT, _ASSERTE dan _ASSERT_EXPR, juga tersedia, tetapi mereka hanya mengevaluasi ekspresi yang diteruskan kepada mereka ketika _DEBUG makro telah ditentukan dan ketika mereka berada dalam kode yang ditautkan dengan versi debug pustaka run-time C.

Persyaratan

Rutin Header yang diperlukan
assert, _wassert <assert.h>

Tanda tangan _assert fungsi tidak tersedia dalam file header. Tanda tangan _wassert fungsi hanya tersedia saat NDEBUG makro tidak ditentukan.

Contoh

Dalam program ini, analyze_string fungsi menggunakan assert makro untuk menguji beberapa kondisi yang terkait dengan string dan panjang. Jika salah satu kondisi gagal, program mencetak pesan yang menunjukkan apa yang menyebabkan kegagalan.

// 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 menghasilkan output ini:

Analyzing string 'abc'
Analyzing string '(null)'
Assertion failed: string != NULL, file crt_assert.c, line 25

Setelah kegagalan pernyataan, tergantung pada versi sistem operasi dan pustaka run-time, Anda mungkin melihat kotak pesan yang berisi sesuatu yang mirip dengan:

A problem caused the program to stop working correctly. Windows will close the program and notify you if a solution is available.

Jika debugger diinstal, pilih tombol Debug untuk memulai debugger, atau Tutup program untuk keluar.

Baca juga

Penanganan kesalahan
Kontrol proses dan lingkungan
abort
raise
signal
_ASSERT, _ASSERTE, _ASSERT_EXPR Makro
_DEBUG