What you're trying to do doesn't make sense.
#define GLUER(x,y,z) x##y##z
#define PxDIR(x) GLUER(P,x,DIR)
int main() {
int port;
port = 2;
PxDIR(port) |= 0x01;
}
The preprocesser is run at (before) compile time. Therefore it can't know anything about the contents of the variable port
. The preprocessor requires that any values passed as arguments to macros be constants. For example, you could do the following:
#define GLUER(x,y,z) x##y##z
#define PxDIR(x) GLUER(P,x,DIR)
int main() {
PxDIR(2) |= 0x01; //setup port 2
}
Otherwise, if you want to be able to pass a variable to this macro really the only way is to make sure the code to do so is explicitly generated:
#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;
}
In this way we make sure there is code for any port from 0 to 3 to be accessed. Also, now we have to watch out for null pointers getting returned from the get_port_pointer function.
#define port 2
? – Ines