Boost C++ 库

...世界上最受推崇和设计精良的 C++ 库项目之一。 Herb SutterAndrei AlexandrescuC++ 编码标准

为 Boost 编写文档

文档结构

简介
符合标准的文档
文档元素
摘要
需求
详细规范
对标准 C++ 库的引用
对标准 C 库的引用
其他约定
类型描述
更多信息
函数语义元素说明
前提条件 (Requires)
效果 (Effects)
后置条件 (Postconditions)
返回值 (Returns)
异常 (Throws)
复杂度 (Complexity)
基本原理 (Rationale)
Web 参考文档
脚注

简介

Boost 不需要任何特定的文档结构。但是,有一些重要的因素会影响内容和结构。例如,许多 Boost 库最终会被提议纳入 C++ 标准,因此最初使用适合纳入标准的文本编写它们可能会有所帮助。此外,Boost 库文档通常通过万维网访问,包括通过搜索引擎访问,因此每个页面都需要上下文。最后,Boost 库应提供其他文档,例如介绍性、教程、示例和基本原理内容。考虑到这些因素,我们建议以下 Boost 库文档指南。

符合标准的 文档

C++ 标准所需的文档结构是描述库技术规范的有效方法。虽然简洁,但这种格式为许多 Boost 用户所熟悉,并且比大多数临时格式更精确。以下描述基于标准的第 17.3 节。(请注意,虽然最终的标准提案必须包含完整的标准化措辞,委员会不会为您提供这些措辞,但 Boost 库文档并不期望达到这种详细程度。)

文档元素

每个文档包含以下元素(如果适用)(1)

摘要

摘要提供了类别的大纲,并介绍了第一级子条款。每个子条款也提供一个摘要,列出子条款中指定的标题以及每个标题中提供的库实体。

标有“注意:”或“示例:”的段落是信息性的,其他段落是规范性的。

摘要和详细规范按以下顺序呈现

需求

库可以通过 C++ 程序扩展。每个条款(如果适用)描述了此类扩展必须满足的要求。此类扩展通常是以下之一

接口约定要求尽可能普遍地陈述。与其说“class X 必须定义一个成员函数 operator++()”,不如说接口要求“对于 class X 的任何对象 x++x 是定义的”。也就是说,运算符是否是成员是未指定的。

需求以明确表达式的形式陈述,这些表达式定义了满足需求的类型的有效术语。对于每组需求,都有一个表指定一组初始的有效表达式及其语义。任何使用需求的通用算法都根据其形式类型参数的有效表达式来描述。

模板参数需求有时会以名称引用。

在某些情况下,语义需求以 C++ 代码的形式呈现。此类代码旨在作为构造与另一个构造等价的规范,而不是必须实现构造的方式。(2)

详细规范

详细规范分别包含以下元素

类成员函数的描述遵循以下顺序(如果适用)(3)

函数语义的描述包含以下元素(如果适用)(4):

前提条件 (Requires): 调用函数的前提条件
效果 (Effects): 函数执行的操作
后置条件 (Postconditions): 函数建立的可观察结果
返回值 (Returns): 函数返回值的描述
异常 (Throws): 函数抛出的任何异常以及导致异常的条件
复杂度 (Complexity): 函数的时间和/或空间复杂度
基本原理 (Rationale): 函数设计或存在的基本原理

库条款中指定的复杂度要求是上限,提供更好复杂度保证的实现满足这些要求。

对标准 C++ 库的引用

对标准 C 库的引用

其他约定

这些约定用于描述实现定义的类型和成员函数。

类型描述

需求子条款可以描述用于指定模板参数约束的名称。

更多信息

函数语义元素说明

函数语义元素描述以上直接取自 C++ 标准,并且非常简洁。以下是每个元素的更详细说明。

请注意使用<code> ... </code> 字体标签来区分实际的 C++ 用法和英文散文。

前提条件 (Requires)

调用函数的前提条件,通常表示为谓词。最常见的前提条件是对参数值的限制,通常以 C++ 表达式的形式出现。例如,

 
void limit( int * p, int min, int max );
前提条件 (Requires): p != 0 && min <= max

C++ 语言规则已经强制执行的要求(例如参数的类型)不会在“前提条件 (Requires)”段落中重复。

效果 (Effects)

函数执行的操作,用散文或 C++ 描述。用散文进行描述通常对实现者限制较少,但通常不如 C++ 代码精确。

如果在一个或多个其他元素中指定了效果,特别是后置条件返回值异常,则不会在效果段落中也进行描述。仅使用单个描述可确保只有一个规范,从而消除了出现差异的风险。

后置条件 (Postconditions)

函数的可观察结果,例如变量的值。后置条件通常表示为函数完成后为真的谓词,以 C++ 表达式的形式出现。例如

 
void make_zero_if_negative( int & x );
后置条件 (Postcondition): x >= 0

返回值 (Returns)

函数返回的值,通常以 C++ 表达式的形式出现。例如

int sum( int x, int y );
返回值 (Returns): x + y

仅指定返回值;类型已由 C++ 语言规则决定。

异常 (Throws)

指定抛出的异常类型以及导致抛出异常的条件。例如,std::basic_string 类指定

 
void resize(size_type n, charT c);
异常 (Throws): 如果 n > max_size(),则抛出 length_error

复杂度 (Complexity)

指定函数的时间和/或空间复杂度通常是不希望的,因为它会过度限制实现者并且难以正确指定。因此,复杂度通常最好作为实现质量问题。

但是,如果符合标准的实现之间存在广泛的性能差异,则库组件可能会变得实际上不可移植。容器就是一个很好的例子。在这些情况下,指定复杂度就变得有意义了。

复杂度通常以广义的“大 O”表示法指定。

基本原理 (Rationale)

指定函数设计或存在的基本原理通常可以帮助用户深入了解库的设计原因。更重要的是,它可以帮助防止在库成熟时“修复”实际上没有损坏的东西。

Web 参考文档

Boost 库文档通常通过万维网访问。使用搜索引擎,可以查看参考内容中深层的页面,而无需任何其他上下文。因此,在每个页面中添加额外的上下文(例如以下内容)会很有帮助

考虑描述在搜索引擎中的有效性也很有用。简洁或含糊的描述不太可能帮助好奇的人找到相关的函数或类型。

脚注

(1) 为了节省空间,不适用于某个条款的项目将被省略。例如,如果某个条款未指定任何需求,则不会有“需求”子条款。
(2) 尽管在某些情况下,代码明确地是最优实现。
(3) 为了节省空间,不适用于某个类的项目将被省略。例如,如果某个类未指定任何比较函数,则不会有“比较函数”子条款。
(4) 为了节省空间,不适用于某个函数的项目将被省略。例如,如果某个函数未指定任何前提条件,则不会有“前提条件 (Requires)”段落。

Valid HTML 4.01 Transitional

修订版2006 年 12 月 4 日

版权所有 © 2001 William E. Kempf

根据 Boost 软件许可证版本 1.0 分发。(请参阅随附文件LICENSE_1_0.txt或复制自https://boost.ac.cn/LICENSE_1_0.txt