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

C++ cli 从C+;调用Debug.Assert的安全方法是什么+;CLI?,c++-cli,assert,C++ Cli,Assert,本博客不推荐: 但我还是想做。我想我需要用某种#if或#ifdef之类的东西来包装我的Debug.Assert。另外,是否有人在C++CLI中有Debug.Assert的好例子 假设我有以下变量:String^validationError=bldError.ToString() 现在我想做一些类似的事情: #if (DEBUG) Debug.Assert(false, "Got the following validation error:" + validationError); #end

本博客不推荐:

但我还是想做。我想我需要用某种
#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);
挑一个

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

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

AfAIK<代码> NDECHGE//COD>在ISOC++标准中定义(也用于启用/禁用标准库的代码< AsStest<<代码>宏),而<代码>调试> <代码>是微软专用的。


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

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

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

MS在--简言之,当您进行发布构建时,编译器可能会也可能不会禁用Assert和其他标记为ConditionalAttribute的方法。例如,C#编译器会禁用它们,而C++/CLI编译器不会。尽管这篇博文已经很老了,但考虑到MSDN页面上的内容,我发现情况不太可能改变。

谢谢,我对NDEBUG有点困惑。你有进一步的参考,如C++的CLI(微软的.NET语言)吗?C++ + CLI语言是ISO/IEC C++的扩展(参见C++ +CLI标准AKA.ECAMA-72,章节“1。范围”)。现在,ISO/IEC C++标准没有以任何方式定义“调试”或“调试生成”一词,但它的确包含或确实依赖于一个称为NDECUG的宏的存在。由于标准库头文件使用“!defined(NDEBUG)”,因此使用它应该是最安全的。当然,您可以使用任何您喜欢的宏,只要您确保它始终针对您正在执行的生成类型定义/未正确定义。是的,然后将其更改为宏,将其称为一行程序。@demoncodemonkey,谢谢。如何制作一个可以使用可变数量参数的宏?我是个呆子。我刚刚意识到我引用的帖子已经有几年了。我想知道
clic++
是否仍然有这个限制。@哈尼什:是的,我在发布之前检查过。您也可以检查,只需使用ildasm.exe.Cool查看IL!作为一个“大傻瓜”就这么多了嘿:)@demoncodemonkey,现在的问题是——2006年的帖子还适用吗?还需要警卫吗?为什么不直接使用CRT?