约定#
本节提供了一些关于我们在 C++ 项目各部分中用于解决常见问题的抽象和开发方法的信息。
文件命名#
C++ 源文件和头文件应使用下划线分隔单词,而不是连字符。然而,编译后的可执行文件会自动使用连字符(例如,src/arrow/scalar_test.cc 将被编译为 arrow-scalar-test)。
C++ 头文件使用 .h 扩展名。任何文件名中不包含 internal 的头文件都被视为公共头文件,并将在构建时自动安装。
内存池#
我们提供了一个默认内存池 arrow::default_memory_pool()。
错误处理和异常#
在错误处理方面,我们返回 arrow::Status 值,而不是抛出 C++ 异常。由于 Arrow C++ 库旨在作为大型 C++ 项目中的组件使用,使用 Status 对象有助于保持良好的代码规范,明确指出函数在何时可能会失败。
最近的一个选择是返回一个 arrow::Result<T> 对象,它可以表示带有 T 值的成功结果,或者带有 Status 值的错误结果。
为了表达内部不变量和“绝不失败”的错误,我们使用 arrow/util/logging.h 中定义的 DCHECK 宏。这些检查在发布版本中会被禁用,旨在捕获内部开发错误,特别是在重构时。这些宏不得包含在任何公共头文件中。
由于我们不使用异常,我们避免在对象构造函数中执行耗时的操作。构造开销大的对象通常会有私有的构造函数,并带有返回 Status 或 Result<T> 的公共静态工厂方法。
有许多对象构造函数,如 arrow::Schema 和 arrow::RecordBatch,在这些构造函数中可能会创建较大的 STL 容器对象(如 std::vector)。虽然在这些构造函数中抛出 std::bad_alloc 是可能的,但这种情况相当罕见,且应用程序很可能在构造函数抛出 std::bad_alloc 之前就已经遇到了其他更严重的问题。
注释和文档字符串#
常规注释以
//开头。Doxygen 文档字符串以
///开头,Doxygen 指令以\开头,如下所示:文档字符串的摘要行使用不定式,而不是陈述语气(例如,“Allocate a buffer” 而不是 “Allocates a buffer”)。