断言检查的便捷策略

时间:2009-09-19 14:00:37

标签: c++ testing assert assertions

有些断言成本很高,有些断言在生产代码中更好。 至少不清楚应该始终启用断言。

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

如何在C ++中完成?

3 个答案:

答案 0 :(得分: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 }
}

使用枚举和静态const bools,所有现代编译器都应优化if(_CLASS_ASSERT) {}

答案 1 :(得分: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

只需使用变量即可。

祝你好运!

答案 2 :(得分:0)

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

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

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

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

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

 #ifdef DISABLE_ASSERT
 #define NDEBUG
 #endif