©
本文档使用
php.cn手册 发布
可以用一个C++模式的编译器来编译PostgreSQL的扩展性,如下:
后台连接的所有函数必须为后台提供一个C接口; 这样,C函数可以调用C++函数。例如,后台连接函数请求一个extern C连接。 对此,那些在后台和C++代码之间传递为指针的函数也是需要的。
使用合适的重分配方法来释放内存。例如,
大多数的后台内存是用palloc()
分配的,因此使用pfree()
来释放,在这种情况下,
使用C++的delete()
会失败。
避免传递到C代码的异常(在extern C函数的最高级别使用一个抓取所有块)。
这是必须的,即使C++代码不会抛出一场,因为类似于内存溢出仍会抛出异常。
任何的异常都必须被抓取,并且向C接口返回相关的错误。
如果可能的话,带有-fno-exceptions的C++编译器排除所有的异常;
在这种情况下,必须检查C++代码中的所有错误,检查new()
返回的空。
如果从C++代码调用后台函数,要确保C++调用堆栈只包含普通的旧数据结构(POD)。
这是必须的,因为后台错误产生一个模糊的longjmp()
(它不能恰当的用POD对象
来展开一个C++请求)。
总之,最好在与后台进程接口的extern C的后面放置C++代码, 并且避免异常,内存和调用堆栈泄漏。