0

这个微控制器的 Python 实现中,他们使用 C 宏,如下所示:

MP_ROM_QSTR(MP_QSTR_mem16)

和:

#define MP_ROM_QSTR(q) MP_OBJ_NEW_QSTR(q)

和:

#define MP_OBJ_NEW_QSTR(qst) ((mp_obj_t)((((mp_uint_t)(qst)) << 2) | 2))

我的问题是:MP_QSTR_mem16似乎从未定义!

那么,这是如何工作的呢?

4

1 回答 1

2

该宏的工作方式与任何宏通过文本替换所做的一样。原始代码

MP_ROM_QSTR(MP_QSTR_mem16)

分两步被替换,首先它被简化为

MP_OBJ_NEW_QSTR(MP_QSTR_mem16)

这减少到

((mp_obj_t)((((mp_uint_t)(MP_QSTR_mem16)) << 2) | 2))

这最终被传递给 C/C++ 编译器。

当您说该术语MP_QSTR_mem16“从未定义”时,这可能是正确的。定义与否与这里宏的使用无关。这个宏不应该是 term 的定义声明MP_QSTR_mem16而是对 term 的使用

该宏生成一个表达式,该表达式将MP_QSTR_mem16转换为 type mp_uint_t,然后将结果值左移两位,将结果值与二进制或2并将结果转换为 type mp_obj_t。这一切都没有定义或声明它开始的值。

您可能想找出值的MP_QSTR_mem16来源。

编辑

在查看了您指向的源代码后,我也很难找到MP_QSTR_mem16. 在我看来,术语说明符MP_QSTR_mem16是通过连接一些字符串来创建的。这可以在 C/C++ 预处理器中使用##运算符完成。如果您在代码中搜索,MP_QSTR_ ##您会发现几个类似这样的事件:

./micropython-master/teensy/mk20dx256_prefix.c:    .name = MP_QSTR_ ## p_port ## p_pin, \

实际上,MP_QSTR_mem16实际定义的位置也可以如下所示:

#define FOO(x) MP_QSTR_ ## x

(……后来,某处……)

int FOO(mem16);

但是尽管在源中搜索了一段时间,但我没有找到这样的地方。它可以非常讨厌地隐藏在宏观逻辑中。找到该位置的合适方法是调整编译器以写出预处理器的结果;在这个你应该能够找到它(但这远远超出了这个问题的主题,所以如果你在使用这种方法时遇到问题,请问另一个问题)。

于 2017-02-13T13:10:28.500 回答