c,带有2个参数问题的宏

时间:2014-01-31 21:53:02

标签: c macros

#define LED     3,3

#define GPIOHigh(port,pin)  (LPC_GPIO ## port->MASKED_ACCESS[(1<< pin)] = (1<< pin))
#define GPIOLow(port,pin)   (LPC_GPIO ## port->MASKED_ACCESS[(1<< pin)] = 0)

#define LED_ON()    GPIOHigh(LED)
#define LED_OFF()   GPIOLow(LED)

无效,抱怨需要2个参数的GPIOHigh()Low()。 那里有魔术吗?

3 个答案:

答案 0 :(得分:2)

“LED”3,3被解释为单个参数。所以它抱怨它缺少另一个论点。宏观替换并不总是将一个替换为另一个。

答案 1 :(得分:1)

添加到您的代码:

    #define TOKEN_EXPAND(a, b) a b
    #define LED_OFF()          TOKEN_EXPAND(GPIOLow, (LED))

作为测试,以下代码:

#include<stdio.h>

#define LED                3,3
#define GPIOLow(port,pin)  (LPC_GPIO ## port->MASKED_ACCESS[(1 << pin)] = 0)
#define TOKEN_EXPAND(a, b) a b
#define LED_OFF()          TOKEN_EXPAND(GPIOLow, (LED))

struct {
   int MASKED_ACCESS[32];
} test, *LPC_GPIO3 = &test;

int main(void) {
   test.MASKED_ACCESS[8] = 1234;
   printf("%d\n", test.MASKED_ACCESS[8]);
   LED_OFF();
   printf("%d\n", test.MASKED_ACCESS[8]);
   return 0;
}

给出:

1234
0

答案 2 :(得分:0)

您试图规避的是宏观扩张的安全特征。

#define GPIOHigh(pair)  do { int a[]=pair; int port=a[0], pin=a[1]; ...;  } while (0)
#define LED  {3,3}
#define LED_ON   GPIOHigh(LED)

当然,这不允许您将##port一起使用......