有些断言成本很高,有些断言在生产代码中更好。 至少不清楚应该始终启用断言。
在我的应用程序中,我希望能够按文件或每个类打开/关闭部分断言。
如何在C ++中完成?
答案 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