【问题标题】:How can I correctly assign a pointer to a call back function?如何正确分配指向回调函数的指针?
【发布时间】:2021-12-29 17:33:41
【问题描述】:

我尝试使用 C 调用 IRQ 中的函数,我得到了下一个代码。

static void (*functionPulsacion)();

void eint2_init(void *funcPulsacion){
    functionPulsacion = funcPulsacion;
}

但是当我在 Keil 中编译时,IDE 会显示下一条消息:

Button2.c(38):警告:#513-D:“void *”类型的值不能分配给“void (*)()”类型的实体

这样做的好方法是什么?

提前谢谢你

【问题讨论】:

  • eint2_init的参数应该是正确的函数指针类型,而不仅仅是void*
  • 分配不正确。这是一个有点迂腐的警告。但是在这种情况下,我会说将函数定义更改为void eint2_init(void (*funcPulsacion)(void)){ 是明智的

标签: c pointers keil


【解决方案1】:

确保funcPulsacion 的类型与functionPulsacion 的类型匹配,如下所示:

static void (*functionPulsacion)(void);

void eint2_init(void (*funcPulsacion)(void)) {
    functionPulsacion = funcPulsacion;
}

使用typedef 来定义函数指针类型是有帮助的,这样它就可以被重用:

typedef void (*functionPulsacion_type)(void);

static void functionPulsacion_type functionPulsacion;

void eint2_init(functionPulsacion_type funcPulsacion) {
    functionPulsacion = funcPulsacion;
}

【讨论】:

  • 为了完整起见,最好也显示没有 typedef 的解决方案。
【解决方案2】:

参数变量的语法与静态变量的语法相同。

static void (*functionPulsacion)(void);

void eint2_init(void (*funcPulsacion)(void)) {
    functionPulsacion = funcPulsacion;
}

不过,Typedef 使函数指针更具可读性。

typedef void (*PulsacionFunc)(void);

static PulsacionFunc pulsacion_func;

void eint2_init(PulsacionFunc a_pulsacion_func) {
   pulsacion_func = a_pulsacion_func;
}

【讨论】:

    【解决方案3】:

    这是指向返回void的可变参数函数的指针类型。

    static void (*functionPulsacion)();
    

    然而,这个函数的参数是void *

    void eint2_init(void *funcPulsacion){
        functionPulsacion = funcPulsacion;
    }
    

    有趣的是,对于任何数据指针,您可以毫无问题地分配void *

    void foo(void *vp)
    {
        int *ip = vp;
    }
    
    void bar(void *vp)
    {
        char *cp = vp;
    }
    

    但是按照标准,不是指向函数指针

    void nope(void *vp)
    {
        void (*fp)() = vp; // this might be a problem!
    }
    

    任何数据指针都可以转换为void * 并再次返回,甚至没有警告。 但那是 data 指针;不是函数指针。我相信 POSIX 这么说 您可以在 void * 和函数指针之间进行赋值,但 C 标准不能。

    不过,您可以在函数指针之间进行转换。

    当然,这是很危险的,因为一旦你调用了这个函数,它就不会关心什么 你认为有的类型;它会根据它知道的类型来做它的事情。 所以,这里最好只使用正确的指针类型。

    void yeah(void (*arg)())
    {
        void (*fp)() = arg;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 2021-06-25
      • 1970-01-01
      • 2015-02-05
      • 2010-09-30
      相关资源
      最近更新 更多