你试图做的事情没有意义。
#define GLUER(x,y,z) x##y##z
#define PxDIR(x) GLUER(P,x,DIR)
int main() {
int port;
port = 2;
PxDIR(port) |= 0x01;
}
预处理器在(之前)编译时运行。因此它对变量的内容一无所知port
。预处理器要求作为参数传递给宏的任何值都是常量。例如,您可以执行以下操作:
#define GLUER(x,y,z) x##y##z
#define PxDIR(x) GLUER(P,x,DIR)
int main() {
PxDIR(2) |= 0x01; //setup port 2
}
否则,如果您希望能够将变量传递给此宏,唯一的方法是确保显式生成执行此操作的代码:
#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;
}
通过这种方式,我们确保从 0 到 3 的任何端口都有代码可以访问。此外,现在我们必须注意从 get_port_pointer 函数返回的空指针。