ASSERT是多余的吗?

San*_*min 4 c c++ assert pointers

ASSERT(pointer);
pointer->x;
Run Code Online (Sandbox Code Playgroud)

在这段代码中,ASSERT似乎是多余的.如果指针为NULL,则指针 - > x无论如何都会失败.我的论点是否正确?

AnT*_*AnT 33

断言的重要(如果不是主要的)目的是记录应该在代码中的某个点保留的不变量.assert如果不变量被破坏,也可以中止该程序的事实只是锦上添花,虽然是非常有用的.我会说在一个典型的程序中,90%的断言是断言,显然不会失败,永远不会失败.换句话说,assert在很大程度上是一种形式化的评论语言.在某种意义上形式化,这些"注释"是用同一种语言编写的,其余的代码是用(C/C++)编写的,而不是简单的英语.

在你的代码示例中,断言是告诉你指针在这里不应该为null.这就是它存在的原因.从这个意义上说,这assert并不是多余的.

就执行流程而言,assert总是多余的,这就是为什么断言通常不在代码的发行版本中编译的原因.没有什么可以阻止你在释放代码中保留断言,但通常是通过引入一种特殊的"释放断言"来完成的.在任何情况下,使代码的主要功能取决于断言所采取的操作并不是一个好的编程习惯.就代码的主要功能而言,断言应该是多余的.


And*_*ffe 19

是的,但是pointer->x(我猜)会以不受控制的方式assert失败,而意志会失败并告诉你到底在哪里.

从某种意义上说,assert永远多余的,当然.

  • 基本上,断言通常用于允许特定于开发人员的处理以调试异常情况,然后可以轻松地编译出来用于生产构建. (3认同)