嵌入式C中的“预期声明”错误

时间:2013-07-12 10:14:23

标签: c arm keil arm7

我收到的错误就像是“预期的声明”

我的代码如下

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

我收到错误说

  1. 预期DIR_IN_Tamper();

  2. 的陈述
  3. 期待对其他部分的陈述.....

5 个答案:

答案 0 :(得分:7)

C预处理器(至少在你使用它的方式)只是一个简单的搜索和替换,所以你有效地运行

/* main */
{ FIO2DIR &= ~0X00001000 ; } (); 

这没有任何意义。删除行

中的括号
DIR_IN_Tamper(); 

对于BUZZER_ONBUZZER_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_ONBUZZER_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;