这是cpython中的循环定义吗?

时间:2017-02-05 09:00:29

标签: python cpython

我正在阅读cpython源代码,我对这些PyXXXObject感到困惑, screen shot 2017-02-05 at 16 55 52

我认为有一个循环定义

它有效!

#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;
}

1 个答案:

答案 0 :(得分: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,在这个阶段,编译器不需要知道这些结构是什么,因为它知道这些指针到结构,它只需要为这个结构分配一个地址的存储,并记住要分配给它们的类型需要匹配。

这实际上是 前向引用 而非循环依赖的情况。

Include/object.h的2.7.11版本的CPython源代码检查代码只是因为这是我必须提供的。