2

我有这个定义

#define LED_CLOCK_PIN (DDRD, PORTD, PD6)

我想再写两个定义,以便获取PORTDPD6值,像这样

#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);

可能吗?

4

3 回答 3

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;. 我不确定这是否完全可移植并由标准保证。

于 2012-12-09T14:44:40.560 回答
1

如果您被允许更改,您首先定义为:

#define LED_CLOCK_PIN  DDRD, PORTD, PD6

然后使用 C99 你可以做(​​未经测试):

#define GET_PORT(x)  (((int[]){x})[1])
于 2012-12-09T14:48:31.100 回答
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实际含义的可能性(因为它访问硬件)可能非常低,所以为什么不让代码明确。

于 2012-12-09T14:54:47.017 回答