2010-09-28 74 views
3

这个博客不推荐它: http://blog.kalmbachnet.de/?postid=78从C++ CLI调用Debug.Assert的安全方法是什么?

但是我想要这样做。我想我需要用我的Debug.Assert包装某种#if#ifdef或类似的东西。另外,没有人有一个很好的例子,在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); 
+0

酷!为了成为一个“宏观noob”嘿:) – demoncodemonkey 2010-09-30 08:55:41

+0

@demoncodemonkey,现在的问题是 - 从2006年的帖子仍然适用?警卫还需要吗? – 2010-09-30 13:28:38

+1

为什么不使用CRT断言? http://msdn.microsoft.com/en-us/library/9sb57dw4.aspx – 2014-05-16 16:54:47

回答

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++,但在这种情况下,它不会有所作为)

+0

谢谢,我对NDEBUG有点困惑。与C++ CLI(Microsoft的.Net语言)有关的进一步参考资料吗? – 2010-09-28 20:57:38

+0

C++/CLI语言是ISO/IEC C++的扩展(请参阅C++/CLI标准,即ECMA-372,章节“1.范围”)。 现在,ISO/IEC C++标准没有以任何方式定义术语“调试”或“调试构建”,但它确实表示包括的效果确实取决于名为NDEBUG的宏的存在。由于标准库头文件使用“!defined(NDEBUG)”,所以它应该是最安全的使用方法。当然你可以使用你喜欢的* any *宏,如果你确定它总是为你正在做的构建类型定义/未定义的。 – 2010-09-28 21:55:06

5

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

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

是的,然后把它变成一个宏来改变它叫做单线程。 – demoncodemonkey 2010-09-28 21:27:40

+0

@demoncodemonkey,谢谢。我怎样才能制作一个可以处理不定数量参数的宏?我是一个宏观noob。 http://msdn.microsoft.com/en-us/library/system.diagnostics.debug.assert。aspx – 2010-09-29 01:36:04

+0

在http://stackoverflow.com/questions/679979接受的答案应该工作 – demoncodemonkey 2010-09-29 09:20:44

2

MS已经在http://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute.aspx证明这种行为 - 把简单地说,当你做一个发布版本,编译器可能会或可能不会禁用断言,并标有ConditionalAttribute类似的方法,。例如,C#编译器会禁用它们,C++/CLI编译器不会。尽管博客文章比较陈旧,但我认为这种情况不太可能发生变化,考虑到它在MSDN页面上的说法。

相关问题