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 . abort
keluar 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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk