选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

不受支持的版本: 9.0
历史版本PostgreSQL 9.0 已于 2015 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本手册首页

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 函数之后,并避免异常、内存和调用栈泄漏。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。