【问题标题】:brace initialized function pointer array: invalid conversion from 'void (*(*)())()' to 'void (*)()'大括号初始化函数指针数组:从 'void (*(*)())()' 到 'void (*)()' 的无效转换
【发布时间】:2013-10-14 21:15:04
【问题描述】:

在我的 arduino 草图中,我需要一个带有签名 void foo() 的函数指针数组。 我在 linux 上使用ino 命令行实用程序(在后台使用 avr-g++)。

但是我在定义数组时遇到了一个非常奇怪的错误。

错误:

error: invalid conversion from ‘void (* (*)())()’ to ‘void (*)()’

在这段代码中

void (*mode_setup[])(void) = {
    &show_time_setup,
    &set_time_setup,    
    &set_alarm_setup,
    &set_date_setup // <-- generates 3 identical error on this line
};

我不明白我做错了什么,因为...int foo[] = { 1, 2, 3 }; .. 完全有效,void (*foo)(void) 是函数指针的语法。

我错过了什么?

编辑:不要介意我愚蠢 函数不是 void foo(),而是 fptr foo() [fptr=function pointer typedef] 对浪费大家时间表示诚挚的歉意

【问题讨论】:

  • 我觉得你需要(*mode_setup)[]
  • set_date_setup的签名是什么?
  • 看来show_time_setup et al 是返回函数指针的函数,而不是void
  • Works for me。问题一定出在您没有显示的代码中。很可能,这四个函数中的一个或多个实际上并不像void f()
  • 除了我原来的评论:无论何时使用函数指针,typedef 确实使代码更具可读性 - typedef void (*setup_func)(void);setup_func mode_setup[] = { ... }; 将是我选择的解决方案。

标签: c++ c arrays arduino function-pointers


【解决方案1】:

我可以使用此代码重现您的错误消息

void (*foo())() {}
void (*arr[])(void) = { &foo };

所以看起来函数的签名不是你想象的那样。需要像这样声明一个包含指向foo 的指针的数组:

void (*(*arr[])())(void) = {
    &foo
};

如果我是你,我会考虑 typedef...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-29
    • 2017-06-30
    • 2018-03-05
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2015-11-08
    • 2011-07-31
    相关资源
    最近更新 更多