It is possible to use a compiler in C++ mode to build
PostgreSQL extensions by following these
All functions accessed by the backend must present a C interface
to the backend; these C functions can then call C++ functions.
For example, extern C linkage is required for
backend-accessed functions. This is also necessary for any
functions that are passed as pointers between the backend and
Free memory using the appropriate deallocation method. For example,
most backend memory is allocated using
palloc(), so use
pfree() to free it, i.e. using C++
delete() in such cases will fail.
Prevent exceptions from propagating into the C code (use a
catch-all block at the top level of all extern C
functions). This is necessary even if the C++ code does not
throw any exceptions because events like out-of-memory still
throw exceptions. Any exceptions must be caught and appropriate
errors passed back to the C interface. If possible, compile C++
with -fno-exceptions to eliminate exceptions entirely;
in such cases, you must check for failures in your C++ code, e.g.
check for NULL returned by
If calling backend functions from C++ code, be sure that the
C++ call stack contains only plain old data structures
(POD). This is necessary because backend errors
generate a distant
longjmp() that does not properly
unroll a C++ call stack with non-POD objects.
In summary, it is best to place C++ code behind a wall of
extern C functions that interface to the backend,
and avoid exception, memory, and call stack leakage.