这是cpython中的循环定义吗?

2024-06-26 14:47:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我在读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;
}

Tags: base源代码includevarcpythonheadstructint
1条回答
网友
1楼 · 发布于 2024-06-26 14:47:43

在使用定义之前,不会对其进行实际评估,因此:

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也是一个宏,根据编译时设置,它要么为nothing,要么为:

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,好的一点是,在这个阶段,编译器不需要知道这些结构是什么,因为它知道这些是指向结构的指针,它只需要将一个地址的存储分配给这个结构,并且记住要分配给它们的类型必须匹配。你知道吗

这实际上是正向引用而不是循环依赖的情况。你知道吗

在CPython源代码的2.7.11版本Include/object.h中检查代码,因为这是我必须处理的。

相关问题 更多 >