有些断言成本很高,有些则最好在生产代码中关闭。至少还不清楚断言是否应该始终启用。
在我的应用程序中,我希望能够在每个文件或每个类的基础上打开/关闭部分断言。
如何在 C++ 中做到这一点?
有些断言成本很高,有些则最好在生产代码中关闭。至少还不清楚断言是否应该始终启用。
在我的应用程序中,我希望能够在每个文件或每个类的基础上打开/关闭部分断言。
如何在 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
对于类范围的停用,我将使用静态 const 类成员或类范围的枚举与自定义宏结合使用:
#define myAssert(x) do { if(_CLASS_ASSERT) { assert(x); } } while(0)
class AssertOff
{
enum { _CLASS_ASSERT = 0 }
}
使用枚举和静态常量布尔值,所有现代编译器都应该优化掉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