【问题标题】:"Expected a statement" error in embedded C嵌入式 C 中的“预期语句”错误
【发布时间】:2013-07-10 20:37:38
【问题描述】:

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

我的代码如下

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

【问题讨论】:

  • 或定义为:#define DIR_IN_Tamper(FIO2DIR) { FIO2DIR &= ~0X00001000 ; };并像DIR_IN_Tamper(FIO2DIR);一样打电话FIO2DIR是什么?
  • #define DIR_IN_Tamper { FIO2DIR &= ~0X00001000 ; } 像这样......
  • 不,我的意思是 FIO2DIR 是什么?如果它的宏然后考虑@phihag 的答案。如果你想传递它的变量,那么就像我建议的那样定义宏函数。
  • FIO2DIR是ARM7的关键词...
  • 最后,我从所有工作正常的地方删除了 ().. 谢谢大家..

标签: c arm keil arm7


【解决方案1】:

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

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

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

DIR_IN_Tamper(); 

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

if(((IN_Tamper >> 12) & 0x01) == 1) {
    BUZZER_ON
} else {
    BUZZER_OFF
}

【讨论】:

  • 对于 BUZZER_ON/OFF 我使用了宏
  • like #define DIR_BUZ() FIO0DIR |= 0x10000000 ; //BUZ P0.28 的方向 #define B_BUZ_E(X) {(X==SET)? (FIO0SET |= PINO_BUZ) : (FIO0CLR |= PINO_BUZ) ;} #define BUZZER_ON() { DIR_BUZ(); B_BUZ_E(1); } #define BUZZER_OFF() { DIR_BUZ(); B_BUZ_E(0); }
【解决方案2】:

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

DIR_IN_Tamper(); 

转换成

{ FIO2DIR &= ~0X00001000 ; }()

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

DIR_IN_Tamper

此外,我怀疑您对BUZZER_ONBUZZER_OFF 有类似的问题。

【讨论】:

  • 不应该将DIR_IN_Tamper 定义为类似函数的宏吗?
  • 也许应该,但我认为这个问题不清楚他到底想做什么
  • @undur_gongor 也许应该是这样,但是,正如 KiaMorot 指出的那样,从这个问题来看,OP 试图做什么还不清楚。我展示了一种语法错误的方法。
  • 如果我删除 {} 它会给出错误错误:#109: 表达式必须具有(指向)函数类型
  • @user2571585:您必须删除普通括号 (()),而不是花括号。
【解决方案3】:

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

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

那么,更好的方法是:

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

...但那是另一回事。

【讨论】:

  • 是的,它是一个宏。但是您尝试像函数一样“调用”它(使用())。因此,您需要一个类似函数的宏。
  • BUZZER_OFF 的宏如下-
  • #define BUZZER_OFF() { DIR_BUZ(); B_BUZ_E(0); }
  • 我是否还需要在这里删除 () 或 {}..?它不是单一的陈述,而是。
  • 首先,您应该将其他宏的定义添加到您的问题中。
【解决方案4】:

单语句、类似函数的宏

在定义像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)

【讨论】:

  • Armaccess.c(973): error: #109: expression must have (pointer-to-) function type
  • @user2571585:您必须删除普通括号 (()),而不是花括号。
  • @user2571585 我对你的问题评论了一些关于{}的内容
  • 我已经从 main.. 中删除了 () 大括号。现在它看起来像 BUZZER_OFF;但仍然有错误
  • 如有疑问,请查看预处理后的源代码:参见stackoverflow.com/q/3742822/238421
【解决方案5】:

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

【讨论】:

  • 就像这样#define DIR_IN_Tamper FIO2DIR &= ~0X00001000 & 不像你提到的......
  • 嗯?我的意思是电话。不是宏定义。看来你对 C 太迷惑了。你应该买一本像样的 C 书,在写代码之前读一读。
  • 然后对你的新错误提出问题,或者说它是什么错误。
  • 代码如下 DIR_IN_Tamper; if(((IN_Tamper >> 12) & 0x01) == 1) BUZZER_ON;否则 BUZZER_OFF;其中 BUZZER_OFF 又是一个宏定义为 #define BUZZER_OFF { DIR_BUZ; B_BUZ_E(0); } 因为它的语句组我使用了 { } 大括号...
  • Mu 建议您避免使用 C 中的宏,它们比您想象的更复杂且容易出错。 This 解释了原因。
猜你喜欢
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多