Das Makro funktioniert wie jedes Makro durch Textersetzung. Der ursprüngliche Code
MP_ROM_QSTR(MP_QSTR_mem16)
wird in zwei Stufen ersetzt, zuerst wird sie zu einer verminderten
MP_OBJ_NEW_QSTR(MP_QSTR_mem16)
dem diese schließlich zu dem C/C++ Kompilierer weitergegeben
((mp_obj_t)((((mp_uint_t)(MP_QSTR_mem16)) << 2) | 2))
reduziert wird.
Wenn Sie sagen, dass der Begriff MP_QSTR_mem16
"nie definiert" ist, dann kann dies wahr sein. Ob es definiert ist oder nicht, hängt nicht mit der Verwendung dieses Makros zusammen. Dieses Makro soll keine Definition oder Deklaration des Begriffs MP_QSTR_mem16
sein, aber stattdessen ist es eine Verwendung des Begriffs.
Das Makro einen Ausdruck erzeugt, der MP_QSTR_mem16
dem Typ mp_uint_t
gegossen wird, dann ist es nach links verschiebt den resultierenden Wert durch zwei Bits, binär-ORS der sich ergebende Wert mit 2
und wandelt das Ergebnis in der Art mp_obj_t
. Nichts davon definiert oder deklariert den Wert, mit dem es begonnen hat.
Sie möchten vielleicht herausfinden, woher der Wert MP_QSTR_mem16
kommen sollte.
EDIT
Nachdem auch Probleme bei der Suche die Deklaration von MP_QSTR_mem16
hatte einen Blick in die Quelle, die Sie verweisen auf ich. Es scheint mir, dass der Begriff Spezifizierer MP_QSTR_mem16
ist erstellt durch Verketten einiger Strings. Dies kann im C/C++ - Präprozessor mit dem Operator ##
erfolgen. Wenn Sie MP_QSTR_ ##
im Code zu suchen finden Sie mehrere Vorkommnisse wie diese:
./micropython-master/teensy/mk20dx256_prefix.c: .name = MP_QSTR_ ## p_port ## p_pin, \
effektiv, der Ort, wo MP_QSTR_mem16
ist eigentlich auch so etwas wie folgt aussehen definiert werden:
#define FOO(x) MP_QSTR_ ## x
(... und später irgendwo ...)
int FOO(mem16);
Aber trotz der Suche nach etwas Zeit in der Quelle habe ich keinen solchen Ort gefunden. Es kann sehr bösartig tief in der Makro-Logik versteckt sein.Ein geeigneter Weg, den Platz zu finden, kann sein, den Compiler zu optimieren, um das Ergebnis des Präprozessors auszugeben; In diesem sollten Sie in der Lage sein, es zu finden (aber das ist weit über das Thema dieser Frage hinaus, also, wenn Sie Probleme haben, diesen Ansatz zu verwenden, stellen Sie bitte eine andere Frage).
Also, wenn Ihre Frage über die Makrodefinition oder wo 'MP_QSTR_mem16' definiert werden könnte? –