[Cython] Header file bug

Seth Shannin sshannin at stwing.upenn.edu
Sat Jun 4 19:36:16 CEST 2011


Hello all,

First, I tried to post this earlier but am pretty sure it didn't go 
through.  If this is a double, I apologize.

This comes out of a discussion on the cython-users list.  I am getting 
some warnings when using cython to compile a python module and then 
calling into the module from c.

I was able to condense the problem down to a very succinct example.

There are three files of interest:

test.pyx:
----------------------------------
cdef class foo:
     cdef int a
     cdef int b
     def __init__(foo self, int a, int b):
         self.a = a
         self.b = b

cdef public void bar(foo x):
     print "My_foo", x.a, x.b

cdef public foo make_foo(int a, int b):
     return foo(a, b)
------------------------------------------

setup.py:
------------------------------------------
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [Extension("test", ["test.pyx"])]

setup(
   name = 'Hello world app',
   cmdclass = {'build_ext': build_ext},
   ext_modules = ext_modules
)
------------------------------------------
and dummy.c:
-----------------------------------------
#include "Python.h"
#include "test.h"

int main(int argc, char** argv){
   Py_Initialize();
   inittest();
   bar(make_foo(1,2));
   return 0;
}
---------------------------------------

I use the following commands to compile and link:
python setup.py build_ext --inplace
gcc -I/usr/include/python2.6 -lpython2.6 -L/usr/include/python2.6/config 
-c dummy.c

The second command generates the following error messages:
In file included from dummy.c:2:
test.h:11: warning: 'struct __pyx_obj_4test_foo' declared inside 
parameter list
test.h:11: warning: its scope is only this definition or declaration, 
which is probably not what you want
dummy.c: In function 'main':
dummy.c:7: warning: passing argument 1 of 'bar' from incompatible 
pointer type
test.h:11: note: expected 'struct __pyx_obj_4test_foo *' but argument is 
of type 'struct __pyx_obj_4test_foo *'

After a bit of digging, I found the problem:
The definition for the struct in question was created in test.c, not 
test.h.
GCC is therefore treating the parameter in test.h as a completely 
separate (and empty) struct declaration.  Luckily, in this case struct 
pointers are being used, so enough mem gets allocated, etc. and 
everything actually ends up working.

That being said, the compiler errors are quite bothersome, and it may be 
that this could cause real errors in more complex programs with more 
interdependencies of types.

I would like to propose as a fix that the struct declaration be 
generated inside the header file instead of the .c file (and on a side 
note, I would personally prefer that the #includes be placed in the 
header file as well).

Thanks for all the work that has been put into this project.  Cython is 
really quite a remarkable tool!

-Seth





More information about the cython-devel mailing list