断言在发布模式下也有效? >我在哪里可以找到一个类似于 Asjt>(…)/Cux>宏的标准,从标准C++库(在代码< >代码>中定义的)中,但这也适用于发布模式吗?或者我该怎么写呢
我喜欢断言(…),因为它会自动打印断言失败的源文件行以及断言表达式。我希望这些功能(如果可能的话)也能在发布模式下使用断言在发布模式下也有效? >我在哪里可以找到一个类似于 Asjt>(…)/Cux>宏的标准,从标准C++库(在代码< >代码>中定义的)中,但这也适用于发布模式吗?或者我该怎么写呢,c++,std,assert,C++,Std,Assert,我喜欢断言(…),因为它会自动打印断言失败的源文件行以及断言表达式。我希望这些功能(如果可能的话)也能在发布模式下使用ASSERT。基本上ASSERT是一个宏,用于计算表达式,如果表达式失败,则打印一些内容,然后aborts。写类似的东西并不难,比如 #define ASSERT(x) do { if( !(x) ) { printfunc( #x ); abort(); } while(0) 然后您可以修改它以满足您的需求。例如,您可能不希望在释放模式下中止。您还可以调整打印输出(仅包括您认
ASSERT
。基本上ASSERT
是一个宏,用于计算表达式,如果表达式失败,则打印一些内容,然后abort
s。写类似的东西并不难,比如
#define ASSERT(x) do { if( !(x) ) { printfunc( #x ); abort(); } while(0)
然后您可以修改它以满足您的需求。例如,您可能不希望在释放模式下中止。您还可以调整打印输出(仅包括您认为有用的信息),以便获得文件和行信息,您可以使用
\uuuu file\uuuu
和\uu line\uuuu
宏(顺便说一句,define中的\x
扩展为包含表达式x
的字符串文字),不要定义NDEBUG
,而assert
将起作用。您可以取消定义NDEBUG
#undef NDEBUG
在assert语句附近
或者您可以定义自己的断言
#define assert(x) printf(...)
我推出了我自己的断言,它也总是在发布模式下启动,基于此: 这是本文的要点,我没有提供实际的实现(AbstractAsserter,基于本文),但您可以理解:
#include <iostream>
struct AbstractAsserter
{
virtual void doAssert(const char* expr, const char* file, int line, const char* function) const
{
std::cout << "Asserting now at " << expr << ", " << file << ", " << line << ", " << function << std::endl;
}
};
struct Local
{
const char* function_;
const char* expr_;
const char* file_;
int line_;
Local( const char* f, const char* ex, const char* file, int line )
: function_( f ), expr_( ex ), file_( file ), line_( line )
{ }
Local operator << ( const AbstractAsserter& impl )
{
impl.doAssert( expr_, file_, line_, function_ );
return *this;
}
};
// More to be added as required...
#if defined( __GNUC__ )
# define WE_FUNCTION __PRETTY_FUNCTION__
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)
# define WE_FUNCTION __func__
#else
# define WE_FUNCTION "null_func()"
#endif
#define WE_ASSERT( expr )\
if( expr );\
else Local( WE_FUNCTION, #expr, __FILE__, __LINE__ )\
<< AbstractAsserter();
int main() {
WE_ASSERT(!"bad BAD BOY!");
return 0;
}
#包括
结构抽象断言器
{
虚空doAssert(常量字符*expr,常量字符*文件,int行,常量字符*函数)常量
{
std::cout在发布模式下使用stdassert
(根据注释,您希望启用编译器优化),这本身并不是问题,正如其他答案所确定的那样。编写自定义的已经完成,因此没有太多问题
然而,引用以下内容:
在您的代码中,一定要自由地使用断言;它们是警惕的、可靠的卫士,可以保护您(您的程序)免遭疯狂
如果您担心进行断言+编译器优化,那么从概念上讲,这两件事会增加一些可能性:
- 断言应该而且可以自由地使用,目的是尽早发现bug,并且主要是为了使断言代码是否会损害性能无关紧要
- 如果您希望/需要使用优化运行,您可能不喜欢assert代码提供的额外(现在已优化,但仍然如此)性能影响
总之,我看到了relase模式断言的使用,但请确保它与“正常”模式分开assert,大多数人会认为它在发布模式下是关闭的。在包括cassert之前,您可能必须先取消定义NDEBUG。如果我#undef NDEBUG
,这不会干扰发布模式下的其他编译器优化?只需不定义NDEBUG
,标准assert就可以了work@Lol4t0但这不会影响到其他人r在发布模式下的优化?至少它是预期的和有文档记录的行为(),如果我#未定义NDEBUG,这不会干扰发布模式下的其他编译器优化?请参阅。简而言之,NDEBUG
仅用于禁用assert
。