【问题标题】:Syntax error on pointer definition that seems valid (from a working library) SDCC似乎有效的指针定义的语法错误(来自工作库)SDCC
【发布时间】:2018-06-15 04:13:26
【问题描述】:

我正在尝试为 Crazyradio PA 编译固件(但问题并非特定于它),我在其中添加了我需要的来自 Nordic Semiconductor 的 SDK 的库。

该库最初打算在 Keil µVision IDE 下编译,所以我很自然地更改了代码中的所有内容以使其与 SDCC 一起工作而没有太多麻烦,但是一个简单的指针定义让我很吃力。 SDCC 编译器给了我这个错误:

syntax error: token -> 'unsigned' ; column 10

对应代码中的这一行:

unsigned char * buf = (unsigned char *)pbuf;

pbuf 是一个无符号字符指针,作为所有这些代码所在的函数的参数传递。

我尝试了以下方法,但没有成功:

  • 改变buf的数据类型(随便改,随便看看)
  • 通过注释前后行来隔离问题
  • 分配一个简单的值而不是 (unsigned char *)pbuf

问题仍然相同(数据类型的差异当然也会发生变化)。解决方案可能很简单,但我的想法很短,而且我只是一名实习生,对 SDCC 的经验很少,所以我希望你能放纵一下。

再次感谢,请教我做错了什么! :)

【问题讨论】:

  • ... 而上一行代码是...
  • 前一行代码不会影响这一行,因为当注释 ouf 时,它给出了严格相同的输出错误。作为记录,如果我错了:memtype = *(unsigned char*)(&pbuf); 谢谢 ;)
  • int main(void) { unsigned char * buf = (unsigned char *)0; } 怎么样?
  • 我猜问题是编译器是C89编译器,变量声明必须在块的开头。您可以尝试在声明周围添加{ ... }
  • @JMA : 你错了——前一行重要的,或者更重要的是声明的上下文很重要。如果在同一范围内此声明之前还有其他非声明性语句/表达式,则将其注释掉可能不会更改上下文。您应该编辑问题以提供所请求的信息,而不是在 cmets 中包含相关信息。

标签: c pointers keil sdcc


【解决方案1】:

检查SDCC documentation 是否符合标准 - 它在所有模式中都有一些相当严重的偏差 - 特别是在第 3.1.3 节中:

您的声明遵循同一范围块内的非声明。将所有声明移到作用域块的顶部或开始一个新的作用域块:

memtype = *(unsigned char*)(&pbuf);

// Start scope block for buf scope...
{
    unsigned char * buf = (unsigned char *)pbuf;

    // buf accessible on this scope only
    ...

}

【讨论】:

    猜你喜欢
    • 2013-12-29
    • 2012-06-26
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2015-02-27
    • 2012-06-18
    • 2013-07-09
    • 2018-01-25
    相关资源
    最近更新 更多