AssertErrorProc on C++ builder XE4

AssertErrorProc on C++ builder XE4

本文关键字:XE4 builder C++ on AssertErrorProc      更新时间:2023-10-16

我正在C++ Builder XE4上研究AssertErrorProc。我找到了德尔菲代码如下。

procedure AssertErrorHandler(
    const iMsg, iFilename: String;
    const iLineNo: Integer;
    const iAddress: Pointer);
var
    Err: String;
begin
    Err :=
      Format(
        '%s (%s line %d @ %x)',
        [iMsg, iFilename, iLineNo, Integer(iAddress)]);
    ShowMessage(Err);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
    AssertErrorProc = AssertErrorHandler;
    Assert(false);
end;

我努力将上述内容转换为C++代码,如下所示。

void __fastcall TForm1::AssertErrorHandler(const String iMsg,
    const String iFilename, const int iLineNo,
    const void* iAddress)
{
    String Err;
    Err = Format(L"%s (%s line %d @ %x)",
        [iMsg, iFilename, iLineNo, Integer(iAddress)]);  // E2188
    ShowMessage(Err);
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    AssertErrorProc = AssertErrorHandler;  // E2235, E2268
    Assert(false);
}

我在编译代码时收到两个错误。

  1. at Format() 语句 (E2188)

  2. 在分配断言错误处理程序时(E2235、E2268)

我很感激我应该修改代码的任何信息。

上述方法仅在 Delphi 中可用, C++您应该将自定义断言定义为宏:

#ifdef _DEBUG
    #undef assert
    #define assert(condition) if(!condition) assertHandler(__FILE__, __LINE__, __FUNCTION__, #condition);
#endif
void assertHandler(const char *fileName, int line, const char *function,
    const char *condition)
{
    char message[255];
    wsprintfA(message, "Assertion failed at %s line %d inside %s condition: %s",
        fileName, line, function, condition);
    ShowMessage(message);
    abort();
}

用法:

assert(myVar > 0);