Thread: #include

#include

From
Elliot Chance
Date:
Hi everyone,

From what i've read in the documentation you need funcapi.h to return SETOF from a C function, the problem is when I
includethe header file the compile throws heaps of errors; offending code 

1. extern "C" {
2.     #include <postgres.h>
3.    #include <fmgr.h>
4.    #include <funcapi.h>
5.
6.    #ifdef PG_MODULE_MAGIC
7.    PG_MODULE_MAGIC;
8.    #endif
9. };

Gives the errors:

In file included from /usr/include/pgsql/server/access/heapam.h:21,
                 from /usr/include/pgsql/server/nodes/execnodes.h:18,
                 from /usr/include/pgsql/server/executor/execdesc.h:18,
                 from /usr/include/pgsql/server/executor/executor.h:17,
                 from /usr/include/pgsql/server/funcapi.h:21,
                 from xapian.cpp:4:
/usr/include/pgsql/server/nodes/primnodes.h:1155: error: expected unqualified-id before ‘using’
/usr/include/pgsql/server/nodes/primnodes.h:1155: error: expected ‘;’ before ‘using’
In file included from /usr/include/pgsql/server/executor/executor.h:18,
                 from /usr/include/pgsql/server/funcapi.h:21,
                 from xapian.cpp:4:
/usr/include/pgsql/server/nodes/parsenodes.h:176: error: expected unqualified-id before ‘typeid’
/usr/include/pgsql/server/nodes/parsenodes.h:259: error: expected unqualified-id before ‘typename’
/usr/include/pgsql/server/nodes/parsenodes.h:259: error: expected ‘;’ before ‘typename’
/usr/include/pgsql/server/nodes/parsenodes.h:459: error: expected unqualified-id before ‘typename’
/usr/include/pgsql/server/nodes/parsenodes.h:459: error: expected ‘;’ before ‘typename’
/usr/include/pgsql/server/nodes/parsenodes.h:556: error: expected unqualified-id before ‘typename’
/usr/include/pgsql/server/nodes/parsenodes.h:556: error: expected ‘;’ before ‘typename’
/usr/include/pgsql/server/nodes/parsenodes.h:1168: error: expected unqualified-id before ‘typename’
/usr/include/pgsql/server/nodes/parsenodes.h:1168: error: expected ‘;’ before ‘typename’
/usr/include/pgsql/server/nodes/parsenodes.h:1672: error: expected unqualified-id before ‘typename’
/usr/include/pgsql/server/nodes/parsenodes.h:1672: error: expected ‘;’ before ‘typename’
/usr/include/pgsql/server/nodes/parsenodes.h:2086: error: expected unqualified-id before ‘typename’
/usr/include/pgsql/server/nodes/parsenodes.h:2086: error: expected ‘;’ before ‘typename’


Any thoughts? Thanks


Re: #include

From
Craig Ringer
Date:
On 12/26/2010 02:14 PM, Elliot Chance wrote:

> In file included from /usr/include/pgsql/server/access/heapam.h:21,
>                   from /usr/include/pgsql/server/nodes/execnodes.h:18,
>                   from /usr/include/pgsql/server/executor/execdesc.h:18,
>                   from /usr/include/pgsql/server/executor/executor.h:17,
>                   from /usr/include/pgsql/server/funcapi.h:21,
>                   from xapian.cpp:4:
> /usr/include/pgsql/server/nodes/primnodes.h:1155: error: expected unqualified-id before ‘using’

You've neglected to mention which version of Pg you're compiling
against, so that line number means nothing. What's the offending line of
code and the surrounding few lines in primnodes.h?

In any case, I think it's very likely the issue is a C/C++
incompatibility in the Pg headers. It fails for me in a different place
using Pg 9.1git and g++ 4.5, complaining about the use of "private" as
an identifier in fmgr.h, because it's a keyword in C++.

This is one of the many reasons you should keep any code that touches
the postgres innards as pure C, and call into your C++ code via "extern
C" functions. The Pg headers aren't really C++ safe. Neither is Pg's
longjmp-based error handling, which really won't mix well with
exceptions or with stack-based objects that have dtors.

--
Craig Ringer

Re: #include

From
Elliot Chance
Date:
Heres an interesting hack I just thought of that works:

extern "C" {
    #include <postgres.h>
    #include <fmgr.h>
    #define using _using
    #define typeid _typeid
    #define typename _typename
    #include <funcapi.h>
    #undef using
    #undef typeid
    #undef typename

    #ifdef PG_MODULE_MAGIC
    PG_MODULE_MAGIC;
    #endif
};


Now there is no collision with the C++ keywords.


On 26/12/2010, at 5:14 PM, Craig Ringer wrote:

> On 12/26/2010 02:14 PM, Elliot Chance wrote:
>
>> In file included from /usr/include/pgsql/server/access/heapam.h:21,
>>                  from /usr/include/pgsql/server/nodes/execnodes.h:18,
>>                  from /usr/include/pgsql/server/executor/execdesc.h:18,
>>                  from /usr/include/pgsql/server/executor/executor.h:17,
>>                  from /usr/include/pgsql/server/funcapi.h:21,
>>                  from xapian.cpp:4:
>> /usr/include/pgsql/server/nodes/primnodes.h:1155: error: expected unqualified-id before ‘using’
>
> You've neglected to mention which version of Pg you're compiling against, so that line number means nothing. What's
theoffending line of code and the surrounding few lines in primnodes.h? 
>
> In any case, I think it's very likely the issue is a C/C++ incompatibility in the Pg headers. It fails for me in a
differentplace using Pg 9.1git and g++ 4.5, complaining about the use of "private" as an identifier in fmgr.h, because
it'sa keyword in C++. 
>
> This is one of the many reasons you should keep any code that touches the postgres innards as pure C, and call into
yourC++ code via "extern C" functions. The Pg headers aren't really C++ safe. Neither is Pg's longjmp-based error
handling,which really won't mix well with exceptions or with stack-based objects that have dtors. 
>
> --
> Craig Ringer