[Cython] Syntax for writing C macros in a Cython .pxd

Neal Becker ndbecker2 at gmail.com
Fri Mar 21 15:18:42 CET 2008


Martin C. Martin wrote:

> Macros in C have a lot of problems, so I think it's best to avoid them
> whenever possible.  In particular:
> 
> - The symbols they define don't show up in the debugger, memory
> profiler, or other tools.
> - They work at the textual level, so it's easy to get incorrect
> behaviour if you forget to add extra parenthesis that aren't needed in
> normal C.
> - When using them to define an inline "function," they can't always be
> used all places a function can.
> 
> In your example:
> 
>   #define _fqtypename(o)   (((PyTypeObject*)o)->ob_type->tp_name)
> 
> _fqtypename(a + b) expands to:
> 
> (((PyTypeObject*)a + b)->ob_type->tp_name)
> 
> And by C's precedence rules, the cast applies to "a" *before* "b" is
> added.
> 
> If you want an inline function, why not just declare it inline?
> 
> The use cases discussed on the list recently were to get around the fact
> that Cython doesn't know all that much about C or C++.  Why not just
> teach it more?
> 
> No language that learned from C, such as Java and Python, include
> macros.  C++ tries hard to provide language support for all idioms that
> C needs them for, and there's even some talk of deprecating macros in
> C++ (IIRC).
> 
> So, I think the response should be to teach Cython about references,
> rather than macros.  What do people think?
> 
> Best,
> Martin
> 
> Stefan Behnel wrote:
>> Hi,
>> 
>> since William brought up this topic lately, I think there are a couple of
>> very valid cases where you want to define a macro in C and use it as a
>> function in Cython. This currently means:
>> 
>> 1) write a macros.h file to hold the macro
>> 2) add a 'cdef extern from "macros.h"' to your favourite .pxd file to
>> define your macros in Cython
>> 
>> So this requires you to keep track of two files for things that may just
>> be a couple of lines in C.
>> 
>> I think this is so common that it would help if you could write inline C
>> code in a .pxd file and have it written into your generated C file
>> automatically. I could imagine a syntax like this:
>> 
>>     # macros.pxd
>>     MACROS = """
>>         #define _isString(obj)   (PyString_CheckExact(obj)  || \
>>                                   PyUnicode_CheckExact(obj) || \
>>                                   PyObject_TypeCheck(obj,
>>                                   &PyBaseString_Type))
>> 
>>         #define _fqtypename(o)   (((PyTypeObject*)o)->ob_type->tp_name)
>>     """
>> 
>>     cdef inline from MACROS:
>>         cdef int _isString(object obj)
>>         cdef char* _fqtypename(object t)
>> 
>> Instead of an '#include "macros.h"', this would write the string given by
>> MACROS verbatimly into the C file, directly behind the #include section.
>> It could also keep track of the strings in a set to make sure they are
>> only written out once, even when cimported redundantly at various places.
>> 
>> Any comments on this?
>> 
Ideally, I agree - but I have no idea how hard it is or how long it would take.



More information about the Cython-dev mailing list