c - 如何将指针作为参数传递给 typedef 函数?

标签 c pointers arduino typedef

我正在努力改进 PJON 内部触发 react 的方式。这是我在 c 中编写的 Arduino 的通信总线系统:https://github.com/gioblu/PJON

我在定义指向接收 int(长度)的新型函数(typedef)的指针和指向字节数组(*payload)的指针时遇到了一些麻烦:

在 .h 文件中,我声明了接收器类型函数:

typedef void (* receiver)(uint8_t length, uint8_t *payload);

PJON 类还包含:

receiver _receiver;

setter 将让用户设置函数将被自动调用:

void PJON::set_receiver(receiver *r) {
  _receiver = r;
}

用户只需声明函数:

receiver led_blink(uint8_t length, uint8_t *payload) {
  digitalWrite(13, HIGH);
  delay(30);
  digitalWrite(13, LOW);
  Serial.println("SUCCESS");
};

并将其传递给 setter :

network.set_receiver(led_blink);

当系统收到消息时:

this->_receiver(data[1] - 4, data + 2); 

调用传递实际参数的函数。

这是我从编译器收到的错误消息:

PJON.ino: In function 'void setup()':
PJON.ino:14:33: error: no matching function for call to 'PJON::set_receiver(void (* (&)(uint8_t, uint8_t*))(uint8_t, uint8_t*))'
PJON.ino:14:33: note: candidate is:
In file included from PJON.ino:1:0:
C:\Users\gio\Desktop\Arduino Software\arduino-1.6.0\libraries\PJON/PJON.h:115:10: note: void PJON::set_receiver(void (**)(uint8_t, uint8_t*))
     void set_receiver(receiver *r);
          ^
C:\Users\gio\Desktop\Arduino Software\arduino-1.6.0\libraries\PJON/PJON.h:115:10: note:   no known conversion for argument 1 from 'void (*(uint8_t, uint8_t*))(uint8_t, uint8_t*) {aka void (*(unsigned char, unsigned char*))(unsigned char, unsigned char*)}' to 'void (**)(uint8_t, uint8_t*) {aka void (**)(unsigned char, unsigned char*)}'

我不明白哪里错了!!

最佳答案

typedef void (* receiver)(uint8_t length, uint8_t *payload);

这将标识符 receiver 定义为指向具有给定签名的函数的指针类型(注意 typedef 中的星号)。所以

void PJON::set_receiver(receiver *r) {
    _receiver = r;
}

实际上需要一个指向函数指针的指针。 (此处省略星号,它应该表达您最初的意思)

就与 C 和/或 C++ 兼容而言,这就是我可以肯定地说的全部……正如评论中已经指出的那样,arduino 有自己的(有点相似)语言——它仍然是一种不同的语言。

关于c - 如何将指针作为参数传递给 typedef 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32550862/

相关文章:

c - ipv6迁移的副作用

c - 当一个线程在 C 中阻塞时,为什么整个进程不会阻塞

Objective-C 中的 C 代码(类/框架/库)

C: "Access Violation"运行时错误

ubuntu - Arduino 库未正确导入 Ubuntu 13 :10

c - 如何在c中编写具有两个条件的if语句?

c - 了解 #define 预处理器指令宏语法

c - scanf 不起作用

c++ - "No Matching Function for Call"在类中引用函数时

arduino - 将二进制数据文件添加到 Arduino 草图