1

有些断言成本很高,有些则最好在生产代码中关闭。至少还不清楚断言是否应该始终启用。

在我的应用程序中,我希望能够在每个文件或每个类的基础上打开/关闭部分断言。

如何在 C++ 中做到这一点?

4

3 回答 3

2

为了在模块范围内停用断言,我将使用:

#if defined(assert)
#  undef assert
#  define assert(x) ((void)0)
#endif

...当然,如果您可以使用自定义宏,这可以简化。

#if defined(_NO_ASSERTS)
#  define myAssert(x) ((void)0)
#else
#  define myAssert(x) assert(x)
#endif

对于类范围的停用,我将使用静态 const 类成员或类范围的枚举与自定义宏结合使用:

#define myAssert(x) do { if(_CLASS_ASSERT) { assert(x); } } while(0)

class AssertOff
{
  enum { _CLASS_ASSERT = 0 }
}

使用枚举和静态常量布尔值,所有现代编译器都应该优化掉if(_CLASS_ASSERT) {}.

于 2009-09-19T16:18:29.307 回答
1

使用断言进行编码考虑了良好的编码风格。

至于运行时打开/关闭您可以使用布尔变量来执行此操作。例如,在您的代码中,您可以执行以下操作:

定义一个变量,用于指示断言是否在全局命名空间中打开或关闭(例如,在同一文件中的 main() 函数之外)。

bool  turnOnAssertions;

在要打开/关闭断言的其他文件中定义如下所示的变量:

extern bool turnOnAssertions; 

因此,通过使用 UI 操作 turnOnAssertions 变量并编写

if(turnOnAssertions)
assert(…);

你可以打开/关闭一些断言!

至于编译时间,您应该执行以下操作:

对于你的编译器,你应该给一个像 –DASSERTIONSON 这样的标志(-Dflag_name [标志名称,你可以设置任何你想要的东西])

#ifdef ASSERTIONSON 
bool turnOnAssertions = true;
#else
bool turnOnAssertions = false;
#endif

并且只使用变量。

祝你好运!

于 2009-09-19T14:54:15.937 回答
0

要禁用 C++ 文件的断言,您可以执行以下操作之一:

  • NDEBUG在源文件顶部附近定义常量。
  • 添加-DNDEBUG到源文件的编译选项。

大多数 IDE 和/或构建基础架构允许您为每个文件指定构建选项,因此这是一个简单的解决方案。

当多个类混合到同一个源文件中,或者你的头文件中有很多内联函数时,关闭每个类的断言会更加困难。你当然可以在相关的地方#define NDEBUG#undef NDEBUG

由于某些 IDE 期望能够NDEBUG为非调试版本设置,因此您可以通过选择自己的宏名称来使其更具可扩展性,例如DISABLE_ASSERT. 然后在通用头文件(未预编译)中包含如下代码:

 #ifdef DISABLE_ASSERT
 #define NDEBUG
 #endif
于 2009-09-19T14:50:57.620 回答