代码之家  ›  专栏  ›  技术社区  ›  Hamish Grubijan

什么是调用调试的安全方法?来自C++ CLI的断言?

  •  3
  • Hamish Grubijan  · 技术社区  · 15 年前

    此博客不推荐: http://blog.kalmbachnet.de/?postid=78

    但我还是想这么做。我想我需要包装我的调试。 #if #ifdef 或者类似的。另外,是否有人有一个很好的调试示例。 C++ CLI ?

    假设我有以下变量: String^ validationError = bldError.ToString(); 现在我想做点什么:

    #if (DEBUG)
    Debug.Assert(false, "Got the following validation error:" + validationError);
    #endif
    

    我怎样才能安全地在 C++ CLI 还有其他要检查的Gotchas吗?

    编辑: 根据答案,我得出了以下宏:

    #ifdef _DEBUG
    #define CLIASSERT(condition, ...) System::Diagnostics::Debug::Assert(condition, ##__VA_ARGS__)
    #else
    #define CLIASSERT(condition, ...) // This macro will completely evaporate in Release.
    #endif
    

    下面是用法示例:

    String^ strValidationError = bldError.ToString();
    CLIASSERT(false, L"Schema validation error: " + strValidationError);
    
    3 回复  |  直到 11 年前
        1
  •  3
  •   Paul Groke Chronial    15 年前

    选择一个

    #ifndef NDEBUG // or
    #if !defined(NDEBUG) // or
    
    #ifdef _DEBUG // or
    #if defined(_DEBUG)
    

    阿法克 NDEBUG 在ISO C++标准中定义(也用于启用/禁用标准库) assert 宏),而 _DEBUG 是特定于Microsoft的。

    (当然C++/CLI不是ISO C++,但在这种情况下它没有区别)

        2
  •  5
  •   Hans Passant    15 年前

    博客文章是准确的。让它看起来像这样:

    #ifdef _DEBUG
        Debug::Assert(...);
    #endif
    
        3
  •  2
  •   Niko Kiirala    14 年前

    微软已经在 http://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute.aspx --简而言之,当您进行发布构建时,编译器可能会禁用或不禁用断言和其他用ConditionAlattribute标记的方法。例如,C++编译器确实禁用它们,C++/CLI编译器也没有。尽管这篇博文相当陈旧,但考虑到它在msdn页面上所说的内容,我发现情况不太可能改变。

    推荐文章