| PostgreSQL 9.0.23 Documentation | ||||
|---|---|---|---|---|
| Prev | Up | Chapter 35. Extending SQL | Next | |
It is possible to use a compiler in C++ mode to build PostgreSQL extensions by following these guidelines:
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 C++ code.
       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 new().
      
       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.