C-Makro-Token Verkettung mit einer Variablen - ist es möglich?
Ich versuche zu definieren, die ein makro zum generieren eines token-Namen, enthält eine variable.
Im Grunde, was ich versuche, ist dies:
#define GLUER(x,y,z) x##y##z
#define PxDIR(x) GLUER(P,x,DIR)
int main() {
int port;
port = 2;
PxDIR(port) |= 0x01;
}
Ich hoffe, dass zum generieren der token P2DIR in der obigen Aussage, aber nach meiner compiler-Ausgabe, es ist die Erzeugung der token PportDIR, das ist NICHT das, was ich wollte. Jede Hilfe hier? Oder ist das, was ich versuche zu tun ist unmöglich?
- Haben Sie zu tun beabsichtigen
#define port 2
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube nicht, dass das, was Sie zu tun versuchen ist möglich. C Makros sind wirklich Präprozessor-Makros werden expandiert bevor die Kompilierung. Die variable
port
, nicht erst zur Laufzeit festgelegt.Ist es unmöglich. C-Präprozessoren arbeiten durch die Verarbeitung Token, und tun Sie nicht, eine Auflösung oder eine substitution erfordern würde, dass die Kenntnis der mechanik der Sprache (außer basic-Arithmetik mit integer-Literale, aus der Spitze von meinem Kopf). Denken Sie zum Beispiel an die Dokumentation für die GCC-Präprozessor in Bezug auf tokenisation. Nur ein compiler wissen, was zu tun mit der variable "port."
One-Lösung ist, etwas zu tun wie:
...und später...
Ich überlasse es Ihnen, zu machen, diese nicht als hässlich oder hacky, wie es hier (und allgemein, je nachdem was Sie brauchen) 🙂
... oder nur der PORT auch ein makro:
Was Sie zu tun versuchen, ist nicht sinnvoll.
Den preprocesser wird an (vor) compile-Zeit. Deshalb kann es nicht wissen, etwas über den Inhalt der Variablen
port
. Der Präprozessor erfordert, dass alle Werte als Argumente übergeben wurden, um Makros Konstanten. Zum Beispiel könnten Sie Folgendes tun:Sonst, wenn Sie wollen in der Lage sein, um übergeben Sie eine variable, um das makro wirklich der einzige Weg ist, um sicherzustellen, dass der code zu tun, ist explizit generiert:
Auf diese Weise stellen wir sicher, dass der code für jeden port von 0 bis 3, auf die zugegriffen werden. Auch jetzt müssen wir aufpassen null-Zeiger immer wieder vom get_port_pointer Funktion.