2017-02-05 28 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版本中檢查,僅僅因爲這是我不得不手。