gpt4 book ai didi

c++ - 断言和 NDEBUG

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:58 28 4
gpt4 key购买 nike

在阅读了一些关于滥用异常的线程后(基本上是说如果函数前提条件不正确你不想展开堆栈 - 可能表示你所有的内存都已损坏或同样危险的东西)我正在考虑使用断言() 更频繁。以前我只使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com