kio wrote: > Hi, > > I'm studying the CPython source code. I don’t quite understand why > they’re using PyObject_VAR_HEAD to define struct like PyListObject. To > define such kind of struct, could I use _PyObject_HEAD_EXTRA as a > header and add "items" pointer and "allocated" count explicity? Is > there any difference? > > Thanks. > > Eric
first, _PyObject_HEAD_EXTRA is only useful for debug and defined as: #ifdef Py_TRACE_REFS #define _PyObject_HEAD_EXTRA \ struct _object *_ob_next; \ struct _object *_ob_prev; #define _PyObject_EXTRA_INIT 0, 0, #else #define _PyObject_HEAD_EXTRA #define _PyObject_EXTRA_INIT #endif and PyObject_HEAD is defined as #define PyObject_HEAD \ _PyObject_HEAD_EXTRA \ int ob_refcnt; \ struct _typeobject *ob_type; PyObject_VAR_HEAD defined as #define PyObject_VAR_HEAD \ PyObject_HEAD \ int ob_size; so you can see the differences between them here. PyListObject is defined as typedef struct{ PyObject_VAR_HEAD PyObject **ob_item; int allocated; }PyListObject; After unfolding these macros we can get typedef struct{ _PyObject_HEAD_EXTRA int ob_refcnt; struct _typeobject *ob_type; int ob_size; PyObject **ob_item; int allocated; }PyListObject; So, if we don't use macros, we have to specify not only the "item" and "allocated", but also the ref count and type information of the object and the size info for a variable object. These information is not only used by PyListObject, but also PyStringObject and PyDictObject, so macros make it convenient and consize. -- http://mail.python.org/mailman/listinfo/python-list