约定#

本节提供了一些关于我们用来解决 C++ 项目中许多部分的常见问题的抽象和开发方法的信息。

文件命名#

C++ 源代码和头文件应该使用下划线来分隔单词,而不是连字符。但是,编译后的可执行文件会自动使用连字符(例如,src/arrow/scalar_test.cc 会被编译成 arrow-scalar-test)。

C++ 头文件使用 .h 扩展名。任何不包含 internal 的头文件名都被视为公共头文件,并且将在构建过程中自动安装。

注释和文档字符串#

常规注释以 // 开头。

Doxygen 文档字符串以 /// 开头,Doxygen 指令以 \ 开头,例如

/// \brief Allocate a fixed size mutable buffer from a memory pool, zero its padding.
///
/// \param[in] size size of buffer to allocate
/// \param[in] pool a memory pool
ARROW_EXPORT
Result<std::unique_ptr<Buffer>> AllocateBuffer(const int64_t size,
                                               MemoryPool* pool = NULLPTR);

文档字符串的摘要行使用不定式,而不是陈述式(例如,“分配一个缓冲区”而不是“分配一个缓冲区”)。

内存池#

我们提供了一个默认内存池,可以使用 arrow::default_memory_pool() 访问。

错误处理和异常#

对于错误处理,我们返回 arrow::Status 值,而不是抛出 C++ 异常。由于 Arrow C++ 库旨在用作大型 C++ 项目中的组件,因此使用 Status 对象有助于保持良好的代码卫生,因为它可以明确地表明函数何时可能失败。

一个较新的选择是返回一个 arrow::Result<T> 对象,它可以表示一个带有 T 值的成功结果,或者一个带有 Status 值的错误结果。

为了表示内部不变式和“不可能失败”的错误,我们使用在 arrow/util/logging.h 中定义的 DCHECK 宏。这些检查在发布版本中被禁用,旨在捕获内部开发错误,特别是在重构时。这些宏不应包含在任何公共头文件中。

由于我们不使用异常,因此我们避免在对象构造函数中进行昂贵的操作。构造成本高的对象通常会有私有构造函数,以及返回 StatusResult<T> 的公共静态工厂方法。

有许多对象构造函数,例如 arrow::Schemaarrow::RecordBatch,其中可能会创建更大的 STL 容器对象,例如 std::vector。虽然在这些构造函数中抛出 std::bad_alloc 是可能的,但它们会出现的环境比较特殊,应用程序在构造函数中抛出 std::bad_alloc 之前很可能已经遇到了其他更严重的问题。