2017-02-05 4 views
0

Я читал CPython исходный код и я запутался об этих PyXXXObject, screen shot 2017-02-05 at 16 55 52Это круговое определение в cpython?

Я думаю, что есть циркуляр определение


это работает!

#include <stdio.h> 
#include <stdlib.h> 

typedef struct _object { 
    struct _typeobject *ob_type; // because it's a pointer! 
} PyObject; 

typedef struct { 
    PyObject ob_base; 
} PyVarObject; 

#define PyObject_VAR_HEAD PyVarObject ob_base; 

typedef struct _typeobject { 
    PyObject_VAR_HEAD 
    const char *tp_name; 
} PyTypeObject; 

int main(int argc, char **argv) { 
    PyVarObject var; 

    return 0; 
} 
+2

Несомненно, это прекрасно! https://ideone.com/0gnqt7 'ob_type' в' struct _object' есть указатель. – Ryan

ответ

1

В определяет на самом деле не оценены, пока они не используются так:

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 просто потому, что это то, что мне пришлось сдать.

Смежные вопросы