有一个讨论,在comp.lang.c超过回事++.关于缓和与否的断言,这在C++中默认情况下只在调试中存在的构建,应保持在生产代码或没有.
显然,每个项目都是独特的,所以在这里我的问题是没有这么多是否断言应该保持,但在这情况下,这是值得推荐的/不是一个好主意.
通过断言,我的意思是:
我不一定在谈论C或C++.
我自己的观点是,如果你是程序员,但不拥有数据(大多数商业桌面应用程序就是这种情况),你应该保持它们,因为失败的断言显示了一个错误,你不应该去有bug,有可能破坏用户的数据.这会强制您在发货前进行强力测试,并使错误更加明显,从而更容易发现并修复.
你有什么看法/经验?
干杯,
卡尔
在此查看相关问题
回应和更新
嘿格雷厄姆,
断言是错误的,纯粹而简单,因此应该像一个一样处理.由于应该在发布模式下处理错误,因此您不需要断言.
这就是为什么我在谈论断言时更喜欢"bug"这个词.它使事情更加清晰.对我来说,"错误"这个词太模糊了.丢失的文件是错误,而不是错误,程序应该处理它.试图取消引用空指针是一个错误,程序应该承认有些东西闻起来像坏奶酪.
因此,您应该使用断言来测试指针,但是存在具有正常错误处理代码的文件.
稍微偏离主题,但讨论中的一个重点.
作为一个单挑,如果你的断言在失败时闯入调试器,为什么不呢.但是有很多原因导致文件不存在,完全不受代码控制:读/写权限,磁盘已满,USB设备已拔下等等.由于您无法控制它,我觉得断言是不是处理这个问题的正确方法.
卡尔
托马斯,
是的,我有代码完成,并且必须说我非常不同意该特定建议.
假设您的自定义内存分配器搞砸了,并将一些仍然被其他对象使用的内存归零.我碰巧将这个对象定期解除引用的指针归零,并且其中一个不变量是该指针永远不为空,并且你有几个断言以确保它保持这种状态.如果指针突然为空,你会怎么做?你只是if()围绕它,希望它有效吗?
请记住,我们在这里讨论产品代码,因此不会破坏调试器并检查本地状态.这是用户机器上的一个真正的错误.
卡尔
我的意思是,我需要做什么才能在我的代码中使用有用的断言?
MFC很简单,我只使用ASSERT(某物).
什么是非MFC方式?
编辑:是否有可能在assert.c中停止断言而不是我的调用assert()的文件?
编辑:<assert.h>&之间有什么区别<cassert>?
一般承认的答案:在这篇文章中有很多很棒的答案,我希望我能接受不止一个答案(或者有人将它们全部合并).所以答案会被授予Ferruccio(第一个答案).
我有一个我想要检查的C++类.所以,我希望所有方法在出门之前打印他们的参数和返回.
后者看起来有点容易.如果我为一切返回(),一个宏
#define return(a) cout << (a) << endl; return (a)
Run Code Online (Sandbox Code Playgroud)
如果我将所有返回括号化为括号(或者可以调用的任何东西),它会做(可能是错误的).如果我想把它拿出来,只需注释掉定义.
但是,打印输入似乎更难.有没有办法,我可以使用C++结构或workaroud黑客?
我想了解用C++设计可测试应用程序的最佳方法,也许与C#相比(因为它是我的背景,非常适合测试)
我习惯于编码接口,依赖注入,控制框架的反转和模拟对象.由于C#有很多不同的语言特性,我不确定有多少模式仍然适用.我还想象C++的独特功能/限制可能会带来不同的测试策略.
我看过单元测试框架,我喜欢Google Test,但是编写我的新代码以尽可能测试它也很重要.
谢谢