2017-02-05 2 views
0

Ich war CPython Quellcode und ich bin verwirrt über diese PyXXXObject, screen shot 2017-02-05 at 16 55 52Ist dies eine zirkuläre Definition in cpython?

Ich denke, es ist eine kreisförmige Definition


es funktioniert beim Lesen!

#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

Sicher, das ist in Ordnung! https://ideone.com/0gnqt7 'ob_type' in' struct_object' gibt es einen Zeiger. – Ryan

Antwort

1

Die definiert sind nicht wirklich, bis sie so verwendet werden ausgewertet:

typedef struct { 
    PyObject_VAR_HEAD 
} PyVarObject; 

wird erweitert:

typedef struct { 
    PyObject_HEAD 
    Py_ssize_t ob_size; /* Number of items in variable part */ 
} PyVarObject; 

Und PyObject_HEAD auch so definiert ist, über die zu erweitert:

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; 

und _PyObject_HEAD_EXTRA ist auch ein Makro, das auf der Kompilierung Einstellungen abhängig ist entweder nichts oder:

typedef struct { 
    Py_ssize_t ob_refcnt; 
    struct _typeobject *ob_type; 
    Py_ssize_t ob_size; /* Number of items in variable part */ 
} PyVarObject; 

oder:

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 _object *_ob_next; 
struct _object *_ob_prev; 

So die Erklärung von PyVarObject eines wird

Zu diesem Zeitpunkt besteht die Strukturdefinition aus einfachen Typen oder Zeigern auf Strukturen, die explizit als struct das nette t angegeben werden Hing über das ist, dass der Compiler in diesem Stadium nicht wissen muss, was diese Strukturen sind, da es weiß, dass diese Zeiger auf Strukturen sind, muss es nur den Speicher für eine Adresse dieser Struktur zuweisen und daran denken Der Typ, der ihnen zugewiesen werden soll, muss übereinstimmen.

Dies ist eigentlich ein Fall von vorwärts verweist nicht zirkuläre Abhängigkeit.

Code von CPython Quelle bei 2.7.11 Version von Include/object.h einfach untersucht, weil das ist, was ich zu übergeben hatte.

Verwandte Themen