我有这个定义
#define LED_CLOCK_PIN (DDRD, PORTD, PD6)
我想再写两个定义,以获得PORTD
和PD6
值,就像这样
#define GET_PORT(_PORT_) /*some magic goes here*/
#define GET_PIN(_PIN_) /*some magic goes here*/
uint8_t port = GET_PORT(LED_CLOCK_PIN);
uint8_t pin = GET_PIN(LED_CLOCK_PIN);
有可能吗?
答案 0 :(得分:4)
你的意思是:
#define LED_CLOCK_PIN (DDRD, PORTD, PD6)
#define SND(A, B, C) B
#define GET_PORT(X) SND X
uint8_t port = GET_PORT(LED_CLOCK_PIN);
gcc -E
将其处理为uint8_t port = PORTD;
。 我不确定这是否完全可移植并且是标准保证。
答案 1 :(得分:1)
如果您被允许更改,请先定义为:
#define LED_CLOCK_PIN DDRD, PORTD, PD6
然后使用C99你可以做(未经测试):
#define GET_PORT(x) (((int[]){x})[1])
答案 2 :(得分:0)
您是否有理由想要参数化端口而不是直接按名称访问它?也就是说,而不是
#define GET_PORT
拥有像
这样的东西会更有意义吗?#define GET_PORT_D (port.D)
#define LED_CLOCK_PIN 0x10 //Bit 5 of the port.D register, for example
#define GET_LED_CLOCK_PIN ( (port.D & LED_CLOCK_PIN) >> 4)
这样,您对端口所做的事情没有任何歧义,因此它提高了可读性。其次,你改变LED_CLOCK_PIN
实际意味着什么(因为它访问硬件)的可能性可能很低,所以再次为什么不明确地使代码。