有些断言代价很高,而有些则更适合在生产代码中关闭。至少不清楚断言是否应该总是被启用。
在我的应用程序中,我希望能够在每个文件或每个类的基础上打开/关闭部分断言。
如何在C++中实现?
发布于 2009-09-19 16:18:29
为了停用模块范围内的断言,我将使用:
#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 }
}使用枚举和静态常量bools,所有现代编译器都应该优化掉if(_CLASS_ASSERT) {}。
发布于 2009-09-19 14:54:16
使用断言进行编码可以认为是一种好的编码风格。
对于运行时的打开/关闭,你可以通过布尔变量来实现。例如,在您的代码中,您可以执行以下操作:
定义一个变量,该变量将用于指示是否在全局名称空间中打开或关闭断言(例如,在同一文件中的main()函数之外)。
bool turnOnAssertions;在您想要打开/关闭断言的其他文件中定义一个变量,如下所示:
extern bool turnOnAssertions; 因此,通过使用UI操作turnOnAssertions变量并编写
if(turnOnAssertions)
assert(…);你可以打开/关闭你的一些断言!
对于编译时,您应该执行以下操作:
对于你的编译器,你应该给出一个像-DASSERTIONSON这样的标志(-Dflag_name标志名,你可以设置任何你想要的)
#ifdef ASSERTIONSON
bool turnOnAssertions = true;
#else
bool turnOnAssertions = false;
#endif只需使用变量。
祝好运!
发布于 2009-09-19 14:50:58
要禁用C++文件的断言,可以执行以下操作之一:
NDEBUG常量。-DNDEBUG添加到源文件的编译选项中。大多数IDE和/或构建基础设施允许您为每个文件指定构建选项,因此这是一个简单的解决方案。
当多个类混合到同一个源文件中,或者在头文件中有许多内联函数时,在每个类的基础上关闭断言会更加困难。当然,您可以在相关位置使用#define NDEBUG和#undef NDEBUG。
由于某些IDE希望能够为非调试构建设置NDEBUG,因此可以通过选择自己的宏名称(如DISABLE_ASSERT )来使其更具可扩展性。然后在一个公共的头文件中包含如下代码(不是预编译的):
#ifdef DISABLE_ASSERT
#define NDEBUG
#endifhttps://stackoverflow.com/questions/1448601
复制相似问题