Re: Mostly Harmless: c++bookends - patch 2 of 4
От | Kurt Harriman |
---|---|
Тема | Re: Mostly Harmless: c++bookends - patch 2 of 4 |
Дата | |
Msg-id | 4938F175.1000400@acm.org обсуждение исходный текст |
Ответ на | Mostly Harmless: Welcoming our C++ friends (Kurt Harriman <harriman@acm.org>) |
Ответы |
Re: Mostly Harmless: c++bookends - patch 2 of 4
(Peter Eisentraut <peter_e@gmx.net>)
|
Список | pgsql-hackers |
(Re-sending just the second of four patches: c++bookends) These patches are based on CVS head in which the latest commit was user: petere date: Thu Dec 04 17:51:28 2008 +0000 summary: Default values for function arguments 2. c++bookends C++ code can call C functions and share global variables with C, provided those declarations are surrounded by "bookends": extern "C" { ... }; Header files can be made bilingual, to declare interfaces which look the same to both C and C++ callers. This is done by placing C++ bookends within the header file, guarded by #ifdefs #ifdef __cplusplus extern "C" { #endif ... #ifdef __cplusplus }; /* extern "C" */ #endif This way the C++ caller can just #include the header file without worrying whether the interface is implemented in C or C++. Usually, extension modules written in C++ will put bookends around all of their PostgreSQL #includes. However, "postgres.h" usually stands alone as the first #include, followed by some system #includes, and then the rest of the PostgreSQL #includes. It is much nicer if a C++ file has just one pair of bookends around its main block of PostgreSQL #includes. This patch gives postgres.h its own internal bookends, making it bilingual, so that its #include can continue to stand alone at the head of each file. Just a few additional header files are mentioned in the PostgreSQL Reference Manual for add-on developers to use: fmgr.h, funcapi.h, and spi.h. This patch adds bookends within those three files for the benefit of beginners writing very simple extensions in C++. Documentation and learning are simplified because C example code can be compiled as C or C++ without change. diff -r 55d732d0fbcd src/include/executor/spi.h --- a/src/include/executor/spi.h +++ b/src/include/executor/spi.h @@ -18,6 +18,10 @@ * included postgres.h */ #include "postgres.h" + +#ifdef __cplusplus +extern "C" { +#endif /* * Most of these are not needed by this file, but may be used by @@ -156,4 +160,8 @@ extern void AtEOXact_SPI(bool isCommit); extern void AtEOSubXact_SPI(bool isCommit, SubTransactionId mySubid); +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif /* SPI_H */ diff -r 55d732d0fbcd src/include/fmgr.h --- a/src/include/fmgr.h +++ b/src/include/fmgr.h @@ -17,6 +17,10 @@ */ #ifndef FMGR_H #define FMGR_H + +#ifdef __cplusplus +extern "C" { +#endif /* We don't want to include primnodes.h here, so make a stub reference */ typedef struct Node *fmNodePtr; @@ -544,4 +548,8 @@ */ extern char *fmgr(Oid procedureId,...); +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif /* FMGR_H */ diff -r 55d732d0fbcd src/include/funcapi.h --- a/src/include/funcapi.h +++ b/src/include/funcapi.h @@ -16,11 +16,14 @@ #ifndef FUNCAPI_H #define FUNCAPI_H +#ifdef __cplusplus +extern "C" { +#endif + #include "fmgr.h" #include "access/tupdesc.h" #include "executor/executor.h" #include "executor/tuptable.h" - /*------------------------------------------------------------------------- * Support to ease writing Functions returning composite types @@ -299,4 +302,8 @@ PG_RETURN_NULL(); \ } while (0) +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif /* FUNCAPI_H */ diff -r 55d732d0fbcd src/include/postgres.h --- a/src/include/postgres.h +++ b/src/include/postgres.h @@ -44,7 +44,12 @@ #ifndef POSTGRES_H #define POSTGRES_H +#ifdef __cplusplus +extern "C" { +#endif + #include "c.h" + #include "utils/elog.h" #include "utils/palloc.h" @@ -693,4 +698,8 @@ const char *errorType, const char *fileName, int lineNumber); +#ifdef __cplusplus +} /* extern "C" */ +#endif + #endif /* POSTGRES_H */
В списке pgsql-hackers по дате отправления: