5

我收到诸如“预期声明”之类的错误

我的代码如下

#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. 期待其他部分的声明......

4

5 回答 5

7

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

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

这没有任何意义。删除行中的括号

DIR_IN_Tamper(); 

对于BUZZER_ONand BUZZER_OFF,您也想删除括号。如果宏未包含在花括号中,您还需要添加它们,例如

if(((IN_Tamper >> 12) & 0x01) == 1) {
    BUZZER_ON
} else {
    BUZZER_OFF
}
于 2013-07-12T10:17:41.803 回答
2

DIR_IN_Tamper被定义为{ FIO2DIR &= ~0X00001000 ; },因此当预处理器解析你的代码时,这一行

DIR_IN_Tamper(); 

被转换成

{ FIO2DIR &= ~0X00001000 ; }()

这显然是不正确的。不确定您到底想要实现什么,但删除括号将消除语法错误:

DIR_IN_Tamper

BUZZER_ON除此之外,我怀疑您对and有类似的问题BUZZER_OFF

于 2013-07-12T10:18:48.757 回答
2

如果你想像函数一样使用DIR_IN_Tamper,你需要一个类函数宏:

#define DIR_IN_Tamper()    { FIO2DIR &= ~0X00001000 ; } 

然后,一个更好的方法是:

#define DIR_IN_Tamper()    do { FIO2DIR &= ~0X00001000 ; } while(0)

......但这是一个不同的故事。

于 2013-07-12T10:21:42.283 回答
1

单语句,类似函数的宏

在定义单语句宏时,请不要使用花括号 ( {and ),例如.}DIR_IN_Tamper

安全地定义类似函数的宏,只需将定义放在括号之间,如下所示:

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

多语句,类似函数的宏

如果您需要定义多语句宏,请参阅此其他 C 常见问题解答条目

例如,定义BUZZER_OFF为:

#define BUZZER_OFF() do { DIR_BUZ(); B_BUZ_E(0); } while (0)
于 2013-07-12T10:31:48.373 回答
0

C 中的宏不是函数。DIR_IN_Tamper();应该是DIR_IN_Tamper;

于 2013-07-12T10:18:25.523 回答