_ASSERT, _ASSERTE, _ASSERT_EXPR Makro

Mengevaluasi ekspresi dan membuat 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 nol (true) atau 0 (false).

message
String lebar untuk ditampilkan sebagai bagian dari laporan.

Keterangan

, _ASSERT_EXPR_ASSERT dan _ASSERTE makro menyediakan aplikasi dengan mekanisme yang bersih dan sederhana untuk memeriksa asumsi selama proses debugging. Mereka sangat fleksibel karena mereka tidak perlu dilampirkan dalam #ifdef pernyataan untuk mencegah mereka dipanggil dalam pembuatan aplikasi ritel. Fleksibilitas ini dicapai dengan _DEBUG menggunakan makro. _ASSERT_EXPR, _ASSERT dan _ASSERTE hanya tersedia ketika _DEBUG didefinisikan pada waktu kompilasi. Saat _DEBUG tidak ditentukan, panggilan ke makro ini akan dihapus selama praproses.

_ASSERT_EXPR, _ASSERT dan _ASSERTE mengevaluasi argumen mereka booleanExpression dan ketika hasilnya ( false 0), mereka mencetak pesan diagnostik dan panggilan _CrtDbgReportW untuk menghasilkan laporan debug. Makro _ASSERT mencetak pesan diagnostik sederhana, _ASSERTE menyertakan representasi string dari ekspresi yang gagal dalam pesan, dan _ASSERT_EXPR menyertakan message string dalam pesan diagnostik. Makro-makro ini tidak melakukan apa-apa ketika booleanExpression dievaluasi ke nol.

_ASSERT_EXPR, _ASSERT dan _ASSERTE invoke _CrtDbgReportW, yang menyebabkan semua output berada dalam karakter yang luas. _ASSERTE mencetak karakter booleanExpression Unicode dengan benar dan _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 untuk mengidentifikasi masalah tanpa mengacu pada kode sumber aplikasi. Namun, ada kerugian karena setiap message cetakan 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 _CrtSetReportMode fungsi dan _CrtSetReportFile fungsi, pesan muncul dalam kotak dialog pop-up yang setara dengan pengaturan:

_CrtSetReportMode(CRT_ASSERT, _CRTDBG_MODE_WNDW);

_CrtDbgReportW menghasilkan laporan debug dan menentukan tujuan atau sasarannya, berdasarkan mode atau mode laporan saat ini dan file yang ditentukan untuk _CRT_ASSERT jenis laporan. Secara default, kegagalan dan kesalahan pernyataan diarahkan ke jendela pesan debug. Fungsi _CrtSetReportMode dan _CrtSetReportFile digunakan untuk menentukan tujuan untuk setiap jenis laporan.

Ketika tujuan adalah jendela pesan debug dan pengguna memilih tombol Coba lagi , _CrtDbgReportW kembalikan 1, menyebabkan _ASSERT_EXPR, _ASSERT dan _ASSERTE makro untuk memulai debugger asalkan debugging just-in-time (JIT) diaktifkan.

Untuk informasi selengkapnya tentang proses pelaporan, lihat _CrtDbgReportfungsi , _CrtDbgReportW . Untuk informasi selengkapnya tentang menyelesaikan kegagalan pernyataan dan menggunakan makro ini sebagai mekanisme penanganan kesalahan debugging, lihat Menggunakan Makro untuk Verifikasi dan Pelaporan.

Selain _ASSERT makro, assert makro dapat digunakan untuk memverifikasi logika program. Makro ini tersedia di versi debug dan rilis pustaka. Makro _RPTdebug _RPTF juga tersedia untuk menghasilkan laporan debug, tetapi tidak mengevaluasi ekspresi. Makro _RPT menghasilkan laporan sederhana. Makro _RPTF mencakup file sumber dan nomor baris tempat makro laporan dipanggil dalam laporan yang dihasilkan. Versi karakter lebar 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 makro dan tersedia dengan menyertakan <crtdbg.h>, aplikasi harus terhubung dengan versi debug dari 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 untuk _ASSERTE menguji kondisi string1 == string2. Jika kondisi gagal, makro ini mencetak pesan diagnostik. Dan _RPT_RPTF kelompok makro juga dilakukan dalam program ini, sebagai alternatif untuk printf fungsi.

// 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, , _RPTFW_RPTWMakro