Die definiert sind nicht wirklich, bis sie so verwendet werden ausgewertet:
typedef struct {
PyObject_VAR_HEAD
} PyVarObject;
wird erweitert:
typedef struct {
PyObject_HEAD
Py_ssize_t ob_size; /* Number of items in variable part */
} PyVarObject;
Und PyObject_HEAD
auch so definiert ist, über die zu erweitert:
typedef struct {
_PyObject_HEAD_EXTRA
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
Py_ssize_t ob_size; /* Number of items in variable part */
} PyVarObject;
und _PyObject_HEAD_EXTRA ist auch ein Makro, das auf der Kompilierung Einstellungen abhängig ist entweder nichts oder:
typedef struct {
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
Py_ssize_t ob_size; /* Number of items in variable part */
} PyVarObject;
oder:
typedef struct {
struct _object *_ob_next;
struct _object *_ob_prev;
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
Py_ssize_t ob_size; /* Number of items in variable part */
} PyVarObject;
struct _object *_ob_next;
struct _object *_ob_prev;
So die Erklärung von PyVarObject
eines wird
Zu diesem Zeitpunkt besteht die Strukturdefinition aus einfachen Typen oder Zeigern auf Strukturen, die explizit als struct
das nette t angegeben werden Hing über das ist, dass der Compiler in diesem Stadium nicht wissen muss, was diese Strukturen sind, da es weiß, dass diese Zeiger auf Strukturen sind, muss es nur den Speicher für eine Adresse dieser Struktur zuweisen und daran denken Der Typ, der ihnen zugewiesen werden soll, muss übereinstimmen.
Dies ist eigentlich ein Fall von vorwärts verweist nicht zirkuläre Abhängigkeit.
Code von CPython Quelle bei 2.7.11 Version von Include/object.h
einfach untersucht, weil das ist, was ich zu übergeben hatte.
Sicher, das ist in Ordnung! https://ideone.com/0gnqt7 'ob_type' in' struct_object' gibt es einen Zeiger. – Ryan