这是cpython中的循环定义吗?
Is this a circular definition in cpython?
我正在阅读 cpython 源代码,我对这些 PyXXXObject 感到困惑,
我觉得有个循环定义
有效!
#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;
}
定义在使用之前不会被实际计算,因此:
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 源代码检查的代码只是因为这是我必须提交的代码。
我正在阅读 cpython 源代码,我对这些 PyXXXObject 感到困惑,
我觉得有个循环定义
有效!
#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;
}
定义在使用之前不会被实际计算,因此:
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 源代码检查的代码只是因为这是我必须提交的代码。