pyrex error

John Machin sjmachin at lexicon.net
Mon Aug 4 14:04:20 CEST 2003


Gerhard Häring <gh at ghaering.de> wrote in message news:<mailman.1059853685.20382.python-list at python.org>...
> Bryan wrote:
> > [PyRex produces code using staticforward that won't work in the combination Python 2.3/MSVC]

> 2) The other way to temporarily solve this problem is to use MINGW 
> instead of MSVC.

*One* other way, not *the* other way. If the OP wanted to muck about
downloading and becoming familiar with a different compiler, he could
also try the free Borland compiler.

And here is a third, easier other way: fiddle with your
....\include\object.h so that it defines staticforward as extern.

It appears we have a change from 2.2 to 2.3 that breaks extensions
compiled with the MS C compiler, which is used to build the win32
version of Python ...
say it ain't so, Joe!

==== from v2.2 object.h ====
/*
A common programming style in Python requires the forward declaration
of static, initialized structures, e.g. for a type object that is used
by the functions whose address must be used in the initializer.
Some compilers (notably SCO ODT 3.0, I seem to remember early AIX as
well) botch this if you use the static keyword for both declarations
(they allocate two objects, and use the first, uninitialized one until
the second declaration is encountered).  Therefore, the forward
declaration should use the 'forwardstatic' keyword.  This expands to
static on most systems, but to extern on a few.  The actual storage
and name will still be static because the second declaration is
static, so no linker visible symbols will be generated.  (Standard C
compilers take offense to the extern forward declaration of a static
object, so I can't just put extern in all cases. :-( )
*/

#ifdef BAD_STATIC_FORWARD
#define staticforward extern
#define statichere static
#else /* !BAD_STATIC_FORWARD */
#define staticforward static
#define statichere static
#endif /* !BAD_STATIC_FORWARD */
==== from v2.3 object.h ====
/*
Define staticforward and statichere for source compatibility with old
C extensions.

The staticforward define was needed to support certain broken C
compilers (notably SCO ODT 3.0, perhaps early AIX as well) botched the
static keyword when it was used with a forward declaration of a static
initialized structure.  Standard C allows the forward declaration with
static, and we've decided to stop catering to broken C compilers.
(In fact, we expect that the compilers are all fixed eight years
later.)
*/

#define staticforward static
#define statichere static




More information about the Python-list mailing list