_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_EXPRMakro , 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_EXPRmakro , 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. _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'

Baca juga

Rutinitas debug
assert Makro, _assert, _wassert
_RPT, _RPTF, _RPTW, _RPTFW Makro