断言在发布模式下也有效? >我在哪里可以找到一个类似于 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在发布模式下使用std
assert
(根据注释,您希望启用编译器优化),这本身并不是问题,正如其他答案所确定的那样。编写自定义的已经完成,因此没有太多问题

然而,引用以下内容:

在您的代码中,一定要自由地使用断言;它们是警惕的、可靠的卫士,可以保护您(您的程序)免遭疯狂

如果您担心进行断言+编译器优化,那么从概念上讲,这两件事会增加一些可能性:

  • 断言应该而且可以自由地使用,目的是尽早发现bug,并且主要是为了使断言代码是否会损害性能无关紧要
  • 如果您希望/需要使用优化运行,您可能不喜欢assert代码提供的额外(现在已优化,但仍然如此)性能影响

总之,我看到了relase模式断言的使用,但请确保它与“正常”模式分开assert,大多数人会认为它在发布模式下是关闭的。

在包括cassert之前,您可能必须先取消定义NDEBUG。如果我
#undef NDEBUG
,这不会干扰发布模式下的其他编译器优化?只需不定义
NDEBUG
,标准assert就可以了work@Lol4t0但这不会影响到其他人r在发布模式下的优化?至少它是预期的和有文档记录的行为(),如果我#未定义NDEBUG,这不会干扰发布模式下的其他编译器优化?请参阅。简而言之,
NDEBUG
仅用于禁用
assert