约定#
本节提供了一些关于我们用来解决 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”)。