回答
用于停用断言模块范围内我会使用:
#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) {}
。
与枚举的好主意。谢谢。 – 2009-09-19 17:22:11
要为C++文件中禁用断言,您可以执行下列操作之一:
- 定义附近的源文件的顶部
NDEBUG
不变。 - 将
-DNDEBUG
添加到源文件的编译选项。
大多数IDE和/或构建基础结构允许您指定每个文件的构建选项,因此这是一个简单的解决方案。
当多个类混合到同一个源文件中,或者在头文件中有许多内联函数时,关闭每个类的断言更加困难。你当然可以在相关的地方#define NDEBUG
和#undef NDEBUG
。
由于一些IDE希望能够为非调试版本设置NDEBUG
,您可以通过选择自己的宏名称(例如DISABLE_ASSERT
)使其更具可扩展性。然后在通用头文件(未预编译)中包含类似以下代码:
#ifdef DISABLE_ASSERT
#define NDEBUG
#endif
'#define NDEBUG'除了禁用断言之外还可能有其他不良的副作用。 – 2009-09-19 16:20:42
有什么副作用? – 2009-09-19 17:20:58
禁用其他调试宏/代码,不仅声明。 – 2009-09-19 17:24:44
要断言的代码考虑良好的编码风格。
至于运行时间打开/关闭您可以用布尔变量来做到这一点。例如,在您的代码中,您可以执行以下操作:
定义一个变量,用于指示断言在全局命名空间中是打开还是关闭(例如,在同一个文件中的main()函数外) 。
bool turnOnAssertions;
定义为下面写在其他文件中要开启/关闭你的断言一个变量:
extern bool turnOnAssertions;
因此,通过与UI操纵turnOnAssertions变量和写作
if(turnOnAssertions)
assert(…);
你可以打开/关闭你的一些断言!
至于编译时,你应该做到以下几点:
为您编译器,你应该给像-DASSERTIONSON标志(-Dflag_name [标记名称,你可以设置你想要的任何东西])
#ifdef ASSERTIONSON
bool turnOnAssertions = true;
#else
bool turnOnAssertions = false;
#endif
并只使用该变量。
祝你好运!
- 1. 通知检查策略
- 2. 黑莓IT策略检查
- 3. AssertJ - 继续用流利的断言检查
- 4. WSP0075:策略断言“TransportBinding”被评估为“UNKNOWN”。为什么?
- 5. 根据Active Directory策略检查密码
- 6. 跨域策略iFrame - 检查元素?
- 7. MINITEST断言失败的检查
- 8. 证明命题重言式的策略?
- 9. 诊断Java内存问题的策略
- 10. 流利断言:断言一个或另一个值
- 11. MSTest有流利的断言API吗?
- 12. 如果使用流利的断言
- 13. 查找Heisenbugs的策略
- 14. 设备策略管理员无法检索设备策略
- 15. PHP问卷调查策略
- 16. 查询加速策略
- 17. 策略查询执行
- 18. 检索当前用户的策略
- 19. 检查是否应用相同的来源策略
- 20. 从mysqli服务器策略检查按钮的Android帮助
- 21. 检查evars的策略,返回一个值
- 22. 如何检查System.Runtime.Caching.ObjectCache内的缓存策略?
- 23. 检查设备上执行的设备管理策略
- 24. 在Red Had Linux上检查硬盘问题的最佳策略
- 25. 在varbinary字段上检查ISNULL的策略?
- 26. WP7政策检查
- 27. 策略
- 28. 从rspec中断言断言与断言
- 29. Symfony:断言/长度忽略空白
- 30. 摩卡柴断言貌似忽略
在编译时或运行时打开/关闭? – 2009-09-19 14:05:28
好点。在编译时。 – 2009-09-19 14:16:32