此博客不推荐它: http://blog.kalmbachnet.de/?postid=78
但无论如何我想要这样做。我想我需要用某种#if
或#ifdef
或类似的东西包装我的Debug.Assert。另外,有没有人在C++ CLI
?
假设我有以下变量: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);
答案 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页面的内容,我发现情况不太可能发生变化。