首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >断言检查的便捷策略

断言检查的便捷策略
EN

Stack Overflow用户
提问于 2009-09-19 14:00:37
回答 3查看 272关注 0票数 1

有些断言代价很高,而有些则更适合在生产代码中关闭。至少不清楚断言是否应该总是被启用。

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

如何在C++中实现?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-09-19 16:18:29

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

代码语言:javascript
复制
#if defined(assert)
#  undef assert
#  define assert(x) ((void)0)
#endif

..。当然,如果您可以使用自定义宏,则可以简化此过程。

代码语言:javascript
复制
#if defined(_NO_ASSERTS)
#  define myAssert(x) ((void)0)
#else
#  define myAssert(x) assert(x)
#endif

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

代码语言:javascript
复制
#define myAssert(x) do { if(_CLASS_ASSERT) { assert(x); } } while(0)

class AssertOff
{
  enum { _CLASS_ASSERT = 0 }
}

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

票数 2
EN

Stack Overflow用户

发布于 2009-09-19 14:54:16

使用断言进行编码可以认为是一种好的编码风格。

对于运行时的打开/关闭,你可以通过布尔变量来实现。例如,在您的代码中,您可以执行以下操作:

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

代码语言:javascript
复制
bool  turnOnAssertions;

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

代码语言:javascript
复制
extern bool turnOnAssertions; 

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

代码语言:javascript
复制
if(turnOnAssertions)
assert(…);

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

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

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

代码语言:javascript
复制
#ifdef ASSERTIONSON 
bool turnOnAssertions = true;
#else
bool turnOnAssertions = false;
#endif

只需使用变量。

祝好运!

票数 1
EN

Stack Overflow用户

发布于 2009-09-19 14:50:58

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

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

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

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

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

代码语言:javascript
复制
 #ifdef DISABLE_ASSERT
 #define NDEBUG
 #endif
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1448601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档