3

如果我有这样的 fnc:

void fnc(const SomeType&){/**/}  

当我列出这个 fnc 的前置条件和后置条件时,我认为列出以下形式的前置条件:
SomeType must be of a correct type是相当愚蠢的,不是吗?我要求这样做是因为在我的大学里,他们希望我们列出这样的内容,但是如果 arg 的类型不正确,则代码无论如何都不会编译,所以我认为拥有这种形式的先决条件是错误的。但像往常一样,我错了。

4

4 回答 4

1

不要说显而易见的。

正如您所说,如果类型不匹配,代码显然不会编译。

前置条件和后置条件将取决于函数试图做什么。

于 2010-11-22T11:58:26.403 回答
0

如果您的老师要求您添加此类注释,则可能不适用于简单的情况,因为此类注释只是愚蠢的并且无论如何都已由编译器验证。

但在某些情况下,算法中定义的形式类型可能比 C++ 中使用的实现类型更具限制性。在这种情况下,这种评论可能会有一些用处。

另一个有用的案例是基于注释的自动生成文档,但是文档系统应该能够自己从函数原型中提取该信息。

于 2010-11-22T12:05:49.927 回答
0

我会这样说:

第一个参数应该是 type SomeType,或者可以转换为它。

编译器是否可以检查它并不重要。如果可以从函数的签名中设计出一些先决条件,那并不意味着这些东西不是先决条件。阅读前提条件后,用户应该能够编写可以正确编译和运行的程序。

于 2010-11-22T12:11:58.227 回答
0

发表这样的评论是愚蠢的——我同意。评论应该提供一些有用的信息。

先决条件列表应该说明为了运行该功能必须满足什么。后置条件列表应该说明函数退出时必须满足的条件。您可以通过三种方式检查这些条件:

  • 运行时断言(使用 c 宏assert()),当必须满足条件才能运行函数时。否则进程终止。
  • 静态断言(如果你使用 c++0x,则使用 std::static_assert 或 BOOST_STATIC_ASSERT)。这通常不做,因为这个检查是在编译时完成的
  • 错误机制(抛出异常或返回错误代码)

您还可以将模板参数列表添加到函数注释中,如果它们不符合要求,则编译失败。

于 2010-11-22T11:53:06.327 回答