【问题标题】:AssertErrorProc on C++ builder XE4C++ builder XE4 上的 AssertErrorProc
【发布时间】:2013-11-05 04:57:18
【问题描述】:

我正在研究 C++ Builder XE4 上的 AssertErrorProc。 我找到的delphi代码如下。

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. 在 Format() 语句 (E2188)

  2. AssertErrorHandler (E2235, E2268) 赋值时

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

【问题讨论】:

    标签: c++ delphi c++builder assert


    【解决方案1】:

    以上方法仅在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);
    

    【讨论】:

    • 非常感谢您的回复。因此,delphi 代码的转换不适用于 C++。感谢您给了我 C++ 的示例代码。它有很大帮助。我从未想过使用#undef 并重新定义断言宏。
    • 我不明白你到底是什么意思。将上述代码放在一个单元(或单个头文件)中,每次需要断言时,使用定义的“断言”宏,例如 assert(MyFunction(param) == 0)
    • 请注意,您可以简单地将上述 delphi 代码转换为 C++: void __fastcall CppAssertErrorProc(const UnicodeString Message, const UnicodeString Filename, int LineNumber, void * ErrorAddr); AssertErrorProc = CppAssertErrorProc;但它不起作用,因为“Assert”命令在 C++ 中未定义,并且“CppAssertErrorProc”从未被断言调用(断言是 C++ 预定义的宏)。
    • 非常感谢。我的评论可能具有误导性。但我想说的是,你的回复很有帮助。我很感激。也感谢您对 CppAssertErrorProc 的进一步评论。
    猜你喜欢
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 2016-05-02
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    相关资源
    最近更新 更多