_ASSERT
, _ASSERTE
, _ASSERT_EXPR
Makro
Evaluasi ekspresi dan buat laporan debug saat hasilnya ( false
hanya versi debug).
Sintaks
// Typical usage:
_ASSERT_EXPR( booleanExpression, message );
_ASSERT( booleanExpression );
_ASSERTE( booleanExpression );
Parameter
booleanExpression
Ekspresi skalar (termasuk ekspresi penunjuk) yang mengevaluasi ke nonzero (true
) atau 0 (false
).
message
String lebar untuk ditampilkan sebagai bagian dari laporan.
Keterangan
_ASSERT_EXPR
Makro , dan _ASSERTE
_ASSERT
menyediakan aplikasi dengan mekanisme yang bersih dan sederhana untuk memeriksa asumsi selama proses debugging. Mereka fleksibel karena tidak perlu diapit dalam #ifdef
pernyataan untuk mencegah mereka dipanggil dalam build ritel aplikasi. Fleksibilitas ini dicapai dengan menggunakan _DEBUG
makro. _ASSERT_EXPR
, _ASSERT
dan _ASSERTE
hanya tersedia ketika _DEBUG
didefinisikan pada waktu kompilasi. Ketika _DEBUG
tidak ditentukan, panggilan ke makro ini dihapus selama praproses.
_ASSERT_EXPR
, _ASSERT
dan _ASSERTE
mengevaluasi argumen mereka booleanExpression
dan ketika hasilnya adalah false
(0), mereka mencetak pesan diagnostik dan panggilan _CrtDbgReportW
untuk menghasilkan laporan debug. _ASSERT
Makro mencetak pesan diagnostik sederhana, _ASSERTE
menyertakan representasi string ekspresi yang gagal dalam pesan, dan _ASSERT_EXPR
menyertakan message
string dalam pesan diagnostik. Makro ini tidak melakukan apa-apa ketika booleanExpression
dievaluasi ke nonzero.
_ASSERT_EXPR
, _ASSERT
dan _ASSERTE
panggil _CrtDbgReportW
, yang menyebabkan semua output berada dalam karakter yang luas. _ASSERTE
mencetak karakter Unicode dengan benar dan booleanExpression
_ASSERT_EXPR
mencetak karakter Unicode di message
.
_ASSERTE
Karena makro menentukan ekspresi yang gagal, dan _ASSERT_EXPR
memungkinkan Anda menentukan pesan dalam laporan yang dihasilkan, mereka memungkinkan pengguna mengidentifikasi masalah tanpa merujuk ke kode sumber aplikasi. Namun, kerugian ada karena setiap message
dicetak oleh _ASSERT_EXPR
dan setiap ekspresi yang dievaluasi oleh _ASSERTE
disertakan dalam file output (versi debug) aplikasi Anda sebagai konstanta string. Oleh karena itu, jika sejumlah besar panggilan dilakukan ke _ASSERT_EXPR
atau _ASSERTE
, ekspresi ini dapat sangat meningkatkan ukuran file output Anda.
Kecuali Anda menentukan sebaliknya dengan fungsi dan _CrtSetReportFile
, pesan muncul dalam kotak dialog pop-up yang setara dengan _CrtSetReportMode
pengaturan:
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_WNDW);
_CrtDbgReportW
menghasilkan laporan debug dan menentukan tujuan atau tujuannya, berdasarkan mode atau mode laporan saat ini dan file yang ditentukan untuk _CRT_ASSERT
jenis laporan. Secara default, kegagalan pernyataan dan kesalahan diarahkan ke jendela pesan debug. Fungsi _CrtSetReportMode
dan _CrtSetReportFile
digunakan untuk menentukan tujuan untuk setiap jenis laporan.
Saat tujuan adalah jendela pesan debug dan pengguna memilih tombol Coba Lagi, _CrtDbgReportW
mengembalikan 1, menyebabkan _ASSERT_EXPR
makro , dan _ASSERT
_ASSERTE
memulai debugger jika penelusuran kesalahan just-in-time (JIT) diaktifkan.
Untuk informasi selengkapnya tentang proses pelaporan, lihat fungsi , _CrtDbgReportW
._CrtDbgReport
Untuk informasi selengkapnya tentang mengatasi kegagalan pernyataan dan menggunakan makro ini sebagai mekanisme penanganan kesalahan penelusuran kesalahan, lihat Makro untuk pelaporan.
Selain _ASSERT
makro, assert
makro dapat digunakan untuk memverifikasi logika program. Makro ini tersedia di versi debug dan rilis pustaka. _RPT
Makro , _RPTF
debug juga tersedia untuk menghasilkan laporan debug, tetapi tidak mengevaluasi ekspresi. _RPT
Makro menghasilkan laporan sederhana. _RPTF
Makro menyertakan file sumber dan nomor baris tempat makro laporan dipanggil dalam laporan yang dihasilkan. Versi karakter yang luas dari makro ini tersedia (_RPTW
, _RPTFW
). Versi karakter lebar identik dengan versi karakter sempit kecuali bahwa string karakter lebar digunakan untuk semua parameter dan output string.
Meskipun _ASSERT_EXPR
, _ASSERT
dan _ASSERTE
merupakan makro dan tersedia dengan menyertakan <crtdbg.h>
, aplikasi harus ditautkan dengan versi debug pustaka run-time C ketika _DEBUG
didefinisikan karena makro ini memanggil fungsi run-time lainnya.
Persyaratan
Makro | Header yang diperlukan |
---|---|
_ASSERT_EXPR , _ASSERT , _ASSERTE |
<crtdbg.h> |
Contoh
Dalam program ini, panggilan dilakukan ke _ASSERT
makro dan _ASSERTE
untuk menguji kondisi string1 == string2
. Jika kondisi gagal, makro ini mencetak pesan diagnostik. Grup _RPT
makro dan _RPTF
juga dilatih dalam program ini, sebagai alternatif untuk fungsi.printf
// crt_ASSERT_macro.c
// compile with: /D_DEBUG /MTd /Od /Zi /link /verbose:lib /debug
//
// This program uses the _ASSERT and _ASSERTE debugging macros.
//
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <crtdbg.h>
int main()
{
char *p1, *p2;
// The Reporting Mode and File must be specified
// before generating a debug report via an assert
// or report macro.
// This program sends all report types to STDOUT.
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);
// Allocate and assign the pointer variables.
p1 = (char *)malloc(10);
strcpy_s(p1, 10, "I am p1");
p2 = (char *)malloc(10);
strcpy_s(p2, 10, "I am p2");
// Use the report macros as a debugging
// warning mechanism, similar to printf.
// Use the assert macros to check if the
// p1 and p2 variables are equivalent.
// If the expression fails, _ASSERTE will
// include a string representation of the
// failed expression in the report.
// _ASSERT does not include the
// expression in the generated report.
_RPT0(_CRT_WARN,
"Use the assert macros to evaluate the expression p1 == p2.\n");
_RPTF2(_CRT_WARN, "\n Will _ASSERT find '%s' == '%s' ?\n", p1, p2);
_ASSERT(p1 == p2);
_RPTF2(_CRT_WARN, "\n\n Will _ASSERTE find '%s' == '%s' ?\n",
p1, p2);
_ASSERTE(p1 == p2);
_RPT2(_CRT_ERROR, "'%s' != '%s'\n", p1, p2);
free(p2);
free(p1);
return 0;
}
Use the assert macros to evaluate the expression p1 == p2.
crt_ASSERT_macro.c(54) :
Will _ASSERT find 'I am p1' == 'I am p2' ?
crt_ASSERT_macro.c(55) : Assertion failed!
crt_ASSERT_macro.c(58) :
Will _ASSERTE find 'I am p1' == 'I am p2' ?
crt_ASSERT_macro.c(59) : Assertion failed: p1 == p2
'I am p1' != 'I am p2'
Baca juga
Rutinitas debug
assert
Makro, _assert
, _wassert
_RPT
, _RPTF
, _RPTW
, _RPTFW
Makro
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