【问题标题】:error: #29: expected an expression in C错误:#29:期望 C 中的表达式
【发布时间】:2013-07-20 05:08:09
【问题描述】:

我的代码包含

#define READ_TAMPER_PIN()   {((FIO2PIN & PIN_TAMPER) >> 12) ;}

PIN_TAMPER 又是一个宏-

 #define PIN_TAMPER     0x00001000;

在其中一个头文件中,它在main()中被调用

x = READ_TAMPER_PIN();  

它给出一个错误提示 "error: #29: expected an expression"

我在这里犯了什么可能的错误??

【问题讨论】:

  • 注意:它在嵌入式 C 中的“错误:预期的表达式”

标签: c embedded arm keil arm7


【解决方案1】:

您的宏中的大括号和分号是错误的。使用:

#define READ_TAMPER_PIN()   ((FIO2PIN & PIN_TAMPER) >> 12)

【讨论】:

  • 你的意思是 {} 大括号?我之前的宏 #define DIR_TAMPER_IN_PORT() {FIO2DIR &= ~PIN_TAMPER ;} 没有给出任何此类错误,但是?
  • 1.是的,我的意思是{}。 2.大概你没有尝试将DIR_TAMPER_IN_PORT()的结果分配给变量。如果你这样做,你会得到同样的错误。
  • 那我应该把它分配给什么??
  • ...你在问什么?我的回答将解决您遇到的问题。如果您有其他问题,您可能应该发布新问题,而不是尝试在此处的 cmets 中这样做。
  • 我已将 x 定义为 unsigned char x 那么我应该将它分配给什么??
【解决方案2】:

根据 c99 标准 (§6.10.3 #10)

表单的预处理指令

#define identifier lparen identifier-listopt ) replacement-list new-line

#define identifier lparen ...) replacement-list new-line

#define identifier lparen identifier-list , ... ) replacement-list new-line

定义一个带参数的类函数宏,类似 语法上是函数调用。参数由 标识符的可选列表,其范围从它们的 标识符列表中的声明,直到换行符 终止 #define 预处理指令。随后的每一个 类似函数的宏名称的实例,后跟 ( 作为下一个 preprocessing token 引入了预处理token的序列 被定义中的替换列表替换(一个 宏的调用)。被替换的预处理序列 令牌由匹配的 ) 预处理令牌终止,跳过 干预匹配的左右括号预处理 令牌。在组成一个预处理标记的序列中 调用类似函数的宏,换行被认为是正常的 空白字符。

【讨论】:

  • 这个答案和OP的问题有什么关系?
  • @CarlNorum 只是说说宏的正确语法。
  • OP 的宏语法很好。只是他对{} 的使用不允许他想做的任务发生。
  • 当然可以。宏替换几乎只是文本替换。你可以放任何你想要的东西。
猜你喜欢
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多