题
有些断言的成本很高,有些断言最好在生产代码中关闭。至少目前还不清楚是否应始终启用断言。
在我的应用程序中,我希望能够基于每个文件或每个类打开/关闭部分断言。
如何在 C++ 中做到这一点?
解决方案
有关钝化断言模块宽的我会使用:
#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
有关类宽失活我会使用一个静态常量类成员或类宽枚举结合自定义宏:
#define myAssert(x) do { if(_CLASS_ASSERT) { assert(x); } } while(0)
class AssertOff
{
enum { _CLASS_ASSERT = 0 }
}
使用枚举和静态常量的bool所有现代编译器应该优化掉if(_CLASS_ASSERT) {}
。
其他提示
要使用断言编码认为编码的良好风格。
<强>作为用于运行时强>开启/关闭你可能做到这一点与布尔变量。例如,在你的代码,你可以做到以下几点:
定义,其将被用来指示是否断言在一个全局命名空间打开或关闭(例如你的main()函数的在同一个文件)的变量。
bool turnOnAssertions;
定义为要开/关你的断言打开其他文件写在下面的变量:
extern bool turnOnAssertions;
因此,通过与UI操纵turnOnAssertions变量和写
if(turnOnAssertions)
assert(…);
您可以开/关你们当中有些人断言开启!
至于编译时间您应该做到以下几点:
有关您编译器,你应该给像-DASSERTIONSON标志(-Dflag_name [标记名称,你可以设置你想要的任何东西])
#ifdef ASSERTIONSON
bool turnOnAssertions = true;
#else
bool turnOnAssertions = false;
#endif
和只使用该变量。
祝你好运!
要禁用 C++ 文件的断言,您可以执行以下操作之一:
- 定义
NDEBUG
常量位于源文件顶部附近。 - 添加
-DNDEBUG
到源文件的编译选项。
大多数 IDE 和/或构建基础设施允许您为每个文件指定构建选项,因此这是一个简单的解决方案。
当多个类混合到同一个源文件中,或者头文件中有很多内联函数时,基于每个类关闭断言会更加困难。你当然可以 #define NDEBUG
和 #undef NDEBUG
在相关的地方。
由于某些 IDE 期望能够设置 NDEBUG
对于非调试版本,您可以通过选择自己的宏名称来使其更具可扩展性,例如 DISABLE_ASSERT
. 。然后在公共头文件中包含如下代码(未预编译):
#ifdef DISABLE_ASSERT
#define NDEBUG
#endif