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