pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
按照以下准则,可以用 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 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。