【问题标题】:Passing variables using call back function pointers使用回调函数指针传递变量
【发布时间】:2018-07-29 06:00:07
【问题描述】:

我想使用回调函数 B 将变量“c”从主函数传递给(任意)函数 A。如前所述,我可以在函数 b 中将变量“b”传递给函数 A,但我找不到从 main 传递的语法。

#include<stdio.h>

void A(int a)
{
    printf("I am in function A and here's a: %d\n", a);
}

// callback function
void B(void (*ptr)(int b) )
{
//    int b = 5;
    int b;
    printf("I am in function B and b = %d\n", b);
    (*ptr) (b); // callback to A
}

int main()
{   
    int c = 6;
    void (*ptr)(int c) = &A;

    // calling function B and passing
    // address of the function A as argument
    B(ptr);

   return 0;
}

有没有使用回调将变量从 main 传递给任意函数的语法?

【问题讨论】:

    标签: c function pointers call back


    【解决方案1】:

    您可能会感到困惑的是函数声明中的参数名称。它们不是必需的,最好放弃它们。

    这两行是一样的:

    void (*ptr)(int c) = &A;
    void (*ptr)(int) = &A;
    

    该表达式中的c 与变量c 无关。此外,您可以使用:

    typedef void (*callback_t)(int);
    

    改为使用以下声明。

    callback_t ptr = &A;
    

    那么很明显,B 需要两个参数。

    void B(callback_t ptr, int param) {
        ptr(param);
    }
    
    int main() {
        ...
        B(ptr, c);
    }
    

    【讨论】:

      【解决方案2】:

      (*ptr) (b)调用函数指针是可以的,但我更喜欢调用它 ptr(b),对我来说更具可读性。这只是我的偏好。

      如果要将变量从main 传递给回调,则将B 更改为 接受回调的值并在调用回调时使用该变量 用函数指针,像这样:

      void B(void (*ptr)(int b), int var_for_callback)
      {
          printf("I am in function B and var_for_callback is %d\n", var_for_callback);
          ptr(var_for_callback);
      }
      
      
      int main()
      {   
          int c = 6;
          void (*ptr)(int c) = &A;
      
          // calling function B and passing
          // address of the function A as argument
          B(ptr, c);
      
         return 0;
      }
      

      现在您将c 的值传递给B,然后B 将其传递给传递的回调 在ptr

      【讨论】:

      • 我知道它们同样好,我只是认为ptr(b) 更具可读性,我想证明这一点。但你是对的,这是没有意义的,因为无论如何它都是正确的。我将删除该部分,因为它可能会造成混淆而不是帮助。感谢您的反馈。
      猜你喜欢
      • 1970-01-01
      • 2020-04-19
      • 2017-07-23
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 2011-07-12
      • 2017-03-25
      • 2013-10-25
      相关资源
      最近更新 更多