[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