如何返回定义参数

时间:2012-12-09 14:28:11

标签: c c-preprocessor

我有这个定义

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

有可能吗?

3 个答案:

答案 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实际意味着什么(因为它访问硬件)的可能性可能很低,所以再次为什么不明确地使代码。