↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

已结束支持的版本: 9.0
历史版本。 PostgreSQL 9.0 已结束支持。 2015-10-08. 请参阅 当前版本手册.

35.15. 在扩展中使用 C++ #

按照以下准则,可以用 C++ 模式的编译器来构建 PostgreSQL 扩展:

  • 后端访问的所有函数都必须向后端呈现 C 接口;这些 C 函数随后可以调用 C++ 函数。例如,后端访问的函数需要 extern C 链接。对于在后端与 C++ 代码之间以指针形式传递的任何函数,这也是必需的。

  • 使用适当的去分配方法释放内存。例如,大多数后端内存是用 palloc() 分配的,所以要用 pfree() 释放;也就是说,在这种情况下使用 C++ 的 delete() 会失败。

  • 防止异常传播到 C 代码中(在所有 extern C 函数的顶层使用全捕获块)。即使 C++ 代码本身不抛出任何异常,这也是必需的,因为内存不足之类的事件仍会抛出异常。任何异常都必须被捕获,并把适当的错误传回 C 接口。如果可能,编译 C++ 时加上 -fno-exceptions 以完全消除异常;在这种情况下,你必须在 C++ 代码中检查失败,例如检查 new() 返回的 NULL。

  • 如果从 C++ 代码调用后端函数,请确保 C++ 调用栈中只包含普通旧数据结构(POD)。这是必需的,因为后端错误会引发远距离的 longjmp(),它无法正确回退包含非 POD 对象的 C++ 调用栈。

总而言之,最好把 C++ 代码放在一墙与后端接口的 extern C 函数之后,并避免异常、内存和调用栈泄漏。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.