Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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_EXPRMakro , dan _ASSERT_ASSERTE 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 _CrtSetReportMode , pesan muncul dalam kotak dialog pop-up yang setara dengan _CrtSetReportFile 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_EXPRmakro , dan _ASSERT_ASSERTE memulai debugger jika penelusuran kesalahan just-in-time (JIT) diaktifkan.
Untuk informasi selengkapnya tentang proses pelaporan, lihat _CrtDbgReportW . 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.
_RPTMakro , _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'
Lihat juga
Rutinitas debug
assert Makro, _assert, _wassert
_RPT, _RPTF, _RPTW, _RPTFW Makro