从C ++ CLI调用Debug.Assert的安全方法是什么?

时间:2010-09-28 20:27:33

标签: c++-cli assert

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

但无论如何我想要这样做。我想我需要用某种#if#ifdef或类似的东西包装我的Debug.Assert。另外,有没有人在C++ CLI

中有一个很好的Debug.Assert示例

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

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

如何在C++ CLI安全地完成这项工作,还有其他需要检查的问题吗?

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

#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 个答案:

答案 0 :(得分:5)

博客文章准确无误。看起来像这样:

#ifdef _DEBUG
    Debug::Assert(...);
#endif

答案 1 :(得分:3)

选择一个

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

#ifdef _DEBUG // or
#if defined(_DEBUG)

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

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

答案 2 :(得分:2)

MS在http://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute.aspx记录了这种行为 - 简而言之,当您进行发布构建时,编译器可能会也可能不会禁用Assert和其他标记为ConditionalAttribute的方法。例如,C#编译器会禁用它们,而C ++ / CLI编译器则不会。虽然博客文章相当陈旧,但考虑到MSDN页面的内容,我发现情况不太可能发生变化。