[Pyrex] C++ forward declaration
Ravi Lanka
ravi_lanka at acusim.com
Sat Apr 5 00:47:55 CEST 2008
Lenard Lindstrom wrote:
> 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,
That's what I ended by doing, but I think I replied only to Robert
instead of the list. As always, Thanks for your input. The mistake I
made earlier was that I used the code below;
cdef extern from "B.h":
ctypedef struct B "MyNameSpace::B":
pass
instead of
cdef extern from "B.h":
ctypedef struct B "MyNameSpace::B"
Ravi
More information about the Pyrex
mailing list