CppCoreGuidelines I.8 用 Ensures() 表达后置条件
21 March 2022
I.8: Prefer Ensures() for expressing postconditions
理由
可以明确后置条件,可以通过某些外部工具进行检查确保。
例子
#include <gsl/gsl_assert> #include <string.h> const int MAX = 10; void f() { char buffer[MAX]; // ... memset(buffer, 0, sizeof(buffer)); Ensures(buffer[0] == 0); } int main() { f(); return 0; }
注意
有多种方式标明后置条件,包括代码注释、条件判断、assert()
。然而,这些方式要么很难和普通代码区分开,要么很难更新,要么很难让工具处理,而且可能语义上是错的。
替代方案
某些函数调用完后必须释放的资源,最好通过 RAII 表达。
注意
理想情况, Ensures
最好是接口的一部分,但是比较难实现。目前我们放在接口定义内。一旦语言支持,核心指南会引入标准的前置条件、后置条件与断言判断。
强化
- 目前语言层面还不支持,请检查
assert()
判断是否合理。