c++ - 将 void (*)() 转换为 void (*)(unsigned char)

标签 c++ function-pointers

我正在尝试将 void (*)() 转换为 void (*)(unsigned char) 但我的 C++ 知识还不够好。我搜索过,但找不到任何示例。所以我想创建一个函数的函数,但我得到了一些错误:

typedef void (* voidFuncPtr)();
void castHandler(voidFuncPtr handler)(uint8_t gpio_num)
{
    handler();
}

void attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode)
{
    // typedef void (* voidFuncPtr)();
    // typedef void (* gpio_interrupt_handler_t)(uint8_t gpio_num);
    // typedef void (* gpio_interrupt_handler_t)(unsigned char)
    gpio_set_interrupt(pin, GPIO_INTTYPE_EDGE_ANY, castHandler(handler));
}

error: 'castHandler' declared as function returning a function void castHandler(voidFuncPtr handler)(uint8_t gpio_num)

error: 'castHandler' was not declared in this scope gpio_set_interrupt(pin, GPIO_INTTYPE_EDGE_ANY, castHandler(handler));

有人可以帮助我吗?

最佳答案

您需要为每个 GPIO 维护一个处理程序表。类似于以下(未经测试且不完整 - 省略了一些初始化和错误检查)代码:

typedef void (* voidFuncPtr)();

voidFuncPtr handlers[MAX_HANDLERS];

void attachInterrupt(uint8_t pin, voidFuncPtr handler, int mode)
{
    handlers[pin] = handler;
}

void handleGPIO(unsigned char pin)
{
    if (handlers[pin])
        handlers[pin]();
}

void enableGPIOInterrupts(void)
{
    /// Do this for each available pin
    gpio_set_interrupt(pin, GPIO_INTTYPE_EDGE_ANY, handleGPIO);
}

关于c++ - 将 void (*)() 转换为 void (*)(unsigned char),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47336654/

相关文章:

C++ 深度懒惰与优雅语法的比较?

c++ - 如何在 C++ 中创建一个包含不同类型函数指针的容器?

ruby-on-rails - 如何在 Ruby 中为 new 创建一个未绑定(bind)的方法

c - 如何设置通过参数传递给函数的 int 值并将其分配给全局,以便我可以在函数外部使用?

c++ - 如何在 Visual Studio 代码中完成后暂停控制台 C++ 应用程序

c++ - 为什么我得到字符串没有命名类型错误?

c# - 读取 DTD 或 Schema 并列出给定元素的所有有效子元素或属性

c - 了解函数指针的 C 语法

c - 如何指示 gcc 像 g++ 那样警告我有关无效函数指针转换的信息?

c++ - 从函数类型中剥离所有限定符