2017-02-05 31 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'struct_object'中的ob_type'有一个指针。 – 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好的t因为它知道这些结构是指针,所以它只需要为该结构分配一个地址的存储空间,并记住要分配给他们的类型需要匹配。

这实际上是向前迈进了一箱参考没有循环依赖

代码从CPython源代码在2.7.11版本的Include/object.h版本中检查,仅仅因为这是我不得不手。