在这个微控制器的 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
似乎从未定义!
那么,这是如何工作的呢?
在这个微控制器的 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
似乎从未定义!
那么,这是如何工作的呢?
该宏的工作方式与任何宏通过文本替换所做的一样。原始代码
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);
但是尽管在源中搜索了一段时间,但我没有找到这样的地方。它可以非常讨厌地隐藏在宏观逻辑中。找到该位置的合适方法是调整编译器以写出预处理器的结果;在这个你应该能够找到它(但这远远超出了这个问题的主题,所以如果你在使用这种方法时遇到问题,请问另一个问题)。