To, co próbujesz zrobić, nie ma sensu.
#define GLUER(x,y,z) x##y##z
#define PxDIR(x) GLUER(P,x,DIR)
int main() {
int port;
port = 2;
PxDIR(port) |= 0x01;
}
Preprocesser jest uruchamiany w (przed) czasie kompilacji. Dlatego nie może nic wiedzieć o zawartości zmiennej port
. Preprocesor wymaga, aby wszelkie wartości przekazywane jako argumenty makr były stałe. Na przykład, można wykonać następujące czynności:
#define GLUER(x,y,z) x##y##z
#define PxDIR(x) GLUER(P,x,DIR)
int main() {
PxDIR(2) |= 0x01; //setup port 2
}
W przeciwnym razie, jeśli chcesz być w stanie przekazać zmienną do tego makra naprawdę jedynym sposobem jest, aby upewnić się, że kod, aby to zrobić jest wyraźnie generowane:
#define GLUER(x,y,z) x##y##z
#define PxDIR(x) GLUER(P,x,DIR)
uint16_t* get_port_pointer(uint8_t port_id) {
if (port == 0) {
return &PxDIR(0);
} else if (port == 1) {
return &PxDIR(1);
} else if (port == 2) {
return &PxDIR(2);
} else if (port == 3) {
return &PxDIR(3);
} else {
return &0;
}
}
int main() {
int port;
port = 2;
*(get_port_pointer(port)) |= 0x01;
}
W ten sposób upewniamy się, że istnieje kod dla dowolnego portu od 0 do 3, aby uzyskać do niego dostęp. Również teraz musimy uważać na wskaźniki null zwracane z funkcji get_port_pointer.
Czy masz zamiar zrobić '#define port 2'? – Gabe