[Pyrex] C++ forward declaration
Lenard Lindstrom
len-l at telus.net
Sat Apr 5 00:21:51 CEST 2008
Robert Bradshaw wrote:
> On Apr 3, 2008, at 4:20 PM, Ravi Lanka wrote:
>
>> Pyrex gurus,
>>
>> I am trying to wrap two C++ classes in a Namespace called
>> "MyNameSpace". I was breezing through using some of the ideas
>> shared by
>> Lenard and others. I got stuck with a case of forward declaration as
>> below. The two classes I have, A and B, have methods that require the
>> objects corresponding to B and A. If I try to declare, say class B,
>> without all the methods before class A and then try to create the
>> complete code for class B, it complains that class B is re-declared.
>> How do I get around this problem ?
>>
>> cdef extern from "A.h":
>> ctypedef struct A "MyNameSpace::A":
>> void (*foo)( B data )
>>
>> cdef extern from "B.h":
>> ctypedef struct B "MyNameSpace::B":
>> void (*bar)( A data )
>>
>> thanks
>> Ravi
>>
>
> I believe you have to do a forward declaration. The following works
> for me:
>
>
> cdef extern from "B.h":
> ctypedef struct B
>
> cdef extern from "A.h":
> ctypedef struct A "MyNameSpace::A":
> void foo(B data)
>
> cdef extern from "B.h":
> ctypedef struct B "MyNameSpace::B":
> void bar(A data)
>
> cdef A a
> cdef B b
>
> # this will compile...but don't run it
> a.foo(b)
> b.bar(a)
>
>
>
First, the Pyrex 0.9.6.4 compiler rejected the above code given by
Robert Bradshaw. Second, even when altered to use function pointers the
generated code was wrong. The global variable b was delcared as "B", not
"MyNameSpace::B". This example corrects both problems:
cdef extern from "B.h":
ctypedef struct B "MyNameSpace::B"
cdef extern from "A.h":
ctypedef struct A "MyNameSpace::A":
void (* foo)(B data)
cdef extern from "B.h":
ctypedef struct B "MyNameSpace::B":
void (* bar)(A data)
cdef A a
cdef B b
# this will compile...but don't run it
a.foo(b)
b.bar(a)
Note that B.h will be included before A.h in the generated C file.
--
Lenard Lindstrom
<len-l at telus.net>
More information about the Pyrex
mailing list