【发布时间】:2018-02-21 09:13:55
【问题描述】:
我最近遇到了 this question 解释的 C-struct 初始化示例。
我不明白的是什么似乎是递归定义;这是来自MicroPython/objtype.c
typedef struct _mp_obj_type_t mp_obj_type_t;
const mp_obj_type_t mp_type_type = { // <-- SAME SYMBOL DEFINED HERE . . .
{ &mp_type_type }, // <-- IS USED HERE
.name = MP_QSTR_type,
.print = type_print,
.make_new = type_make_new,
.call = type_call,
.unary_op = mp_generic_unary_op,
.attr = type_attr,
};
.<some_field>指定的字段我明白了(见第一句的链接)。
但是关于“递归”初始化呢?
MicroPython code 中还有其他使用这种语法的实例:
const mp_obj_type_t pyb_led_type = {
{ &mp_type_type }, <-- SAME SYMBOL AS ABOVE
.name = MP_QSTR_LED,
.print = led_obj_print,
.make_new = led_obj_make_new,
.locals_dict = (mp_obj_t)&led_locals_dict,
};
这更有意义:struct pyb_led_type 使用 struct mp_type_type 中设置的默认值进行初始化,并且某些字段已更改为默认值。
但是const mp_obj_type_t mp_type_type 呢?
结构 mp_type_type 默认为 . . .结构mp_type_type 。 . . ???
预处理后的输出与.c相同。
这里发生了什么?
这是结构体的几个字段
struct _mp_obj_type_t {
// A type is an object so must start with this entry, which points to mp_type_type.
mp_obj_base_t base;
// The name of this type.
qstr name;
// Corresponds to __repr__ and __str__ special methods.
mp_print_fun_t print;
...
};
struct _mp_obj_base_t {
const mp_obj_type_t *type MICROPY_OBJ_BASE_ALIGNMENT;
};
typedef struct _mp_obj_base_t mp_obj_base_t;
【问题讨论】:
-
其他值没有默认值。
mp_obj_type_t中的一个字段是一个指针,它是用指针值初始化的。 -
同:
void * p = &p; -
@melpomene 要明确:您是说第一个语句
{&mp_type_type}只是分配给struct _mp_obj_type_t类型的第一个成员? -
struct _mp_obj_type_t的定义是什么?这似乎是在创建一个包含指向自身的指针以供某些用途的结构。我很好奇它是如何被使用的,为什么会有这种指向自我的指针。我想不出为什么这个特殊的自引用对象会有用,但这可能是由于我缺乏想象力。 -
@Adrian 好吧,大概第一个成员是另一个结构,因此附加了大括号。