【问题标题】:C function pointers error storage class specified for parameter `type name'为参数“类型名称”指定的 C 函数指针错误存储类
【发布时间】:2012-05-22 15:02:54
【问题描述】:

我目前有一段代码正在使用函数指针作为回调。我遇到了来自 gcc 的错误,说明“为参数‘类型名称’指定了存储类”相关的代码部分是:

error_t addCommand(uint8_t command, void  (*callback)(uint16_t,uint8_t)){

这实际上是使用 TinyOS 的 nesC 语言,但它似乎是一个 C 问题。在我对该问题的研究中,我发现建议主要来自以下两个问题之一:

  1. 标题中有问题(缺少分号)
  2. 传递具有静态或易失性值的函数指针(即void (*callback)(volatile int, uint8_t)

据我所知,我已经消除了问题 1。问题 2 仅在 uint16_tuint8_t 是 volatile 的静态(我对这些类型没有太多经验)时才是问题。非常感谢任何有关如何解决此问题的提示/答案。

另外,如果有人熟悉 nesC,确切的代码看起来更像这样:

command error_t CommandEngine.addCommand(uint8_t command,
                                         void  (*callback)(uint16_t,uint8_t)) {

nesC 添加到 C 语言中的内容可能会导致此错误,但我不认为是这种情况。

编辑:在某种程度上,它是 nesC。事实证明,我是个白痴,当 nesC 使用 command 并在编译之前转换为某些 C 代码块时,我使用 command 作为变量名。感谢大家将其转换为 C 代码的想法,因为这让我意识到了这个问题。我真的应该想到这一点。

【问题讨论】:

  • void (*callback)(uint16_t,uint8_t) - 它不只是一个类型吗?我们不应该在函数定义期间在这里有一个参数名称吗?
  • 另一个存储类是extern,所以看看有没有extern没有被正确使用的情况。

标签: c gcc callback function-pointers nesc


【解决方案1】:

对函数指针使用 typedef 通常比较好。它可能会解决您的问题,并且肯定会更具可读性:

typedef void (*callback_t)(uint16_t,uint8_t);
error_t addCommand(uint8_t command, callback_t callback)){

如果它不能解决问题,它至少会缩小范围 - 你会看到问题出在 typedef 还是函数上。

您还应该尝试弄清楚它是 nesC(我对此一无所知)还是 C。尝试删除 nesC 的特定部分并使用 gcc 编译,看看会发生什么。

【讨论】:

  • 虽然其他 cmets 也提到了这一点,但删除 nesC 特定部分使我意识到我在 nesC(命令)中使用了保留字作为函数参数名称。在发送到 gcc 编译器之前,它被扩展为 C 的某个块。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-15
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多