В определяет на самом деле не оценены, пока они не используются так:
typedef struct {
PyObject_VAR_HEAD
} PyVarObject;
расширяется до:
typedef struct {
PyObject_HEAD
Py_ssize_t ob_size; /* Number of items in variable part */
} PyVarObject;
И PyObject_HEAD
определяется как хорошо, так что выше расширяется:
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;
и _PyObject_HEAD_EXTRA также макрос, который в зависимости от компиляции настроек времени нет ни ничего или:
struct _object *_ob_next;
struct _object *_ob_prev;
Так декларация PyVarObject
становится одним из:
typedef struct {
Py_ssize_t ob_refcnt;
struct _typeobject *ob_type;
Py_ssize_t ob_size; /* Number of items in variable part */
} PyVarObject;
или:
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
nice t hing о том, что компилятор на данном этапе не должен знать, что представляют собой эти структуры, поскольку он знает, что для структур это указатели, ему просто нужно выделить хранилище для адреса этой структуры и помнить, что тип, который должен быть выделен им, должен соответствовать.
Это на самом деле случай опережающие ссылки не циклическую зависимость.
Код проверен из источника CPython версии 2.7.11 Include/object.h
просто потому, что это то, что мне пришлось сдать.
Несомненно, это прекрасно! https://ideone.com/0gnqt7 'ob_type' в' struct _object' есть указатель. – Ryan