我在读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;
}
在使用定义之前,不会对其进行实际评估,因此:
扩展到:
并且
PyObject_HEAD
也被定义,因此上面的扩展到:而且PyObjectHEADEXTRA也是一个宏,根据编译时设置,它要么为nothing,要么为:
因此
PyVarObject
的声明变成:或:
在这个阶段,结构定义由简单类型或指向结构的指针组成,这些类型或指针被显式地表示为
struct
,好的一点是,在这个阶段,编译器不需要知道这些结构是什么,因为它知道这些是指向结构的指针,它只需要将一个地址的存储分配给这个结构,并且记住要分配给它们的类型必须匹配。你知道吗这实际上是正向引用而不是循环依赖的情况。你知道吗
在CPython源代码的2.7.11版本
Include/object.h
中检查代码,因为这是我必须处理的。相关问题 更多 >
编程相关推荐