#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()
。
那里有魔术吗?
答案 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
一起使用......