c++ - 断言和 NDEBUG

标签 c++ error-handling

在阅读了一些关于滥用异常的线程后(基本上是说如果函数前提条件不正确你不想展开堆栈 - 可能表示你所有的内存都已损坏或同样危险的东西)我正在考虑使用断言() 更频繁。以前我只使用 assert() 作为调试工具,我认为这就是很多 C++ 程序员使用它的方式。我担心我的部分错误处理会被 NDEBUG #define 在未来某个时候引入运行时构建而关闭。有没有办法解决这个问题,其他人对此有疑问(即我应该担心它)吗?

谢谢, 帕特

编辑: 我正在阅读的线程的要点是,如果您的应用程序确实存在问题,那么展开堆栈可能会损坏系统,例如,如果析构函数向文件写入内容并且文件句柄已损坏。我并不是建议使用 assert 进行正常的错误处理。我当前的用例非常薄弱,但看看您的想法:


  //check later code won't crash the system
  if( buf.length() % 2 )
    return false;
  // do other stuff that shouldn't affect bufs length
  //copy 2 bytes into buf at a time, if length is odd then don't know 
  //what will happen so use assert to make sure it can't damage anything
  assert( !(buf.length() % 2) );
  for( i = 0; i != buf.length(); i += 2 )
    memcpy( buf + i, data, 2 );
 

edit2:讨论在这里: http://groups.google.com/group/comp.lang.c++.moderated/browse_frm/thread/80083ac31a1188da

最佳答案

您可以构建自己的断言,而不是使用常用的 C assert.h。您的断言不会被禁用。

查看 assert() 是如何在/usr/include/assert.h(或其他地方)中实现的。这只是一些预处理器魔法,最终调用“断言失败”函数。

在我们的嵌入式环境中,我们一直在替换 assert()。

关于c++ - 断言和 NDEBUG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/389180/

相关文章:

c++ - MinGW/CMake 对 ZLib 的 undefined reference

c++ - 为什么此 C++ 代码会导致运行时错误?

c++ - 如何获取我当前正在使用 Clang 访问的文件的名称?

java - 何时记录链式异常?

c++ - 如何使用前一个 block 的哈希值链接两个 block ?

c++ - 在不更改 main() 函数的情况下更改 C++ 输出

c# - 找不到Q#AggregateException

python - 如何创建 tkinter 错误消息框

php - 处理缺少/错误键入的 GET 变量的最佳做法?

json - Restful API - 带有单个或所有错误的 JSON 响应