我收到的错误就像是“预期的声明”
我的代码如下
#define IN_Tamper 0X00001000 /*P2.12 = EINT2*/
#define DIR_IN_Tamper { FIO2DIR &= ~0X00001000 ; }
/* main */
DIR_IN_Tamper();
if(((IN_Tamper >> 12) & 0x01) == 1)
BUZZER_ON();
else
BUZZER_OFF();
我收到错误说
预期DIR_IN_Tamper();
期待对其他部分的陈述.....
答案 0 :(得分:7)
C预处理器(至少在你使用它的方式)只是一个简单的搜索和替换,所以你有效地运行
/* main */
{ FIO2DIR &= ~0X00001000 ; } ();
这没有任何意义。删除行
中的括号DIR_IN_Tamper();
对于BUZZER_ON
和BUZZER_OFF
,您也想删除括号。如果宏没有用花括号括起来,你也想添加它们,比如
if(((IN_Tamper >> 12) & 0x01) == 1) {
BUZZER_ON
} else {
BUZZER_OFF
}
答案 1 :(得分:2)
DIR_IN_Tamper
定义为{ FIO2DIR &= ~0X00001000 ; }
,因此当预处理器解析您的代码时,此行
DIR_IN_Tamper();
转换为
{ FIO2DIR &= ~0X00001000 ; }()
这显然不正确。不确定你究竟想要实现什么,但删除括号将消除语法错误:
DIR_IN_Tamper
除此之外,我怀疑您与BUZZER_ON
和BUZZER_OFF
存在类似问题。
答案 2 :(得分:2)
如果你想像函数一样使用DIR_IN_Tamper
,你需要一个类似函数的宏:
#define DIR_IN_Tamper() { FIO2DIR &= ~0X00001000 ; }
然后,更好的方法是:
#define DIR_IN_Tamper() do { FIO2DIR &= ~0X00001000 ; } while(0)
......但这是一个不同的故事。
答案 3 :(得分:1)
单语句,类似函数的宏
在定义{
等单语句宏时,请不要使用大括号(}
和DIR_IN_Tamper
)。
要safely define类似函数的宏,只需将您的定义放在括号之间,如下所示:
#define DIR_IN_Tamper() (FIO2DIR &= ~0X00001000)
然后,像这样调用你的宏:
DIR_IN_Tamper();
它的行为类似于更改FIO2DIR
值的函数,然后返回更改后的值:
/* Your macro rewritten as a function.
The return type should be the type of FIO2DIR */
uint32_t DIR_IN_Tamper()
{
return (FIO2DIR &= ~0X00001000);
}
多语句,类似函数的宏
如果您需要定义多语句宏,请参阅this other C FAQ entry。
例如,将BUZZER_OFF
定义为:
#define BUZZER_OFF() do { DIR_BUZ(); B_BUZ_E(0); } while (0)
答案 4 :(得分:0)
C中的宏不是函数。 DIR_IN_Tamper();
应为DIR_IN_Tamper;
。