【问题标题】:Accessing to the argument of a declared function访问已声明函数的参数
【发布时间】:2018-12-11 18:19:33
【问题描述】:

我有以下函数声明:

typedef void (cback) (scan_results *scan_result, uint8_t *adv_data);

我声明函数如下:

cback my_cback;

我将my_cback 作为输入提供给函数。然后,我想访问my_cback 的参数。我怎样才能做到这一点?

【问题讨论】:

  • 你确定这两行能编译吗?
  • 是的,我相信它会编译
  • @EugeneSh:假设我将cback 声明为指向函数的指针,以便稍后在声明这样的指针的参数时使用。同时,当我定义my_cback 时,我想确保它符合预期的函数类型。如果cback 是一个指针,我看不到这样做的方法。但是,鉴于它是一个类型,我可以先声明cback my_cback;,然后用void my_cback(scan_results *, uint8_t *) {…}定义函数,如果它与cback类型不匹配,编译器会给我一个错误。
  • @EugeneSh。需要编写my_cback 的标准定义。你不能为此使用 typedef 别名,当然你需要提供一个与之兼容的定义。
  • @AlperenGörmez:你“想在什么代码中访问my_cback的参数”?在my_cback 的代码中,您只需通过参数名称访问它们,就像在任何其他函数中一样。在任何其他代码中,参数都不在范围内。

标签: c function callback typedef


【解决方案1】:

使用我的 VC2008 编译并运行以下代码:

typedef void (cback) (int *scan_result, int *adv_data);

void f(int *scan_result, int *adv_data)
{
    *adv_data= *scan_result;
}
void ftest(cback *g, int k)
{
    int l;
    g(&k, &l);           // call the function passed as argument
    printf("%d\n",l);
}
void test(void)
{
    int i=3, j;
    cback *my_cback= f;   // assign f to a function pointer variable
    my_cback(&i,&j);      // call  the function pointer directly
    printf("%d\n",j);
    ftest(my_cback, 4);   // pass the function pointer
}

输出:

3
4

【讨论】:

    【解决方案2】:

    我将my_cback 作为输入提供给函数。
    然后,我想访问 my_cback 的参数。我怎样才能做到这一点?

    传递给函数(下面的foobar()),不仅是my_cback,还有要传递给my_cback() 的参数。

    #include <stdint.h>
    #include <stdio.h>
    
    typedef char *scan_results;
    typedef void (cback) (scan_results *scan_result, uint8_t *adv_data);
    
    // Declare function
    cback my_cback;
    
    // Define function
    void my_cback(scan_results *scan_result, uint8_t *adv_data) {
      *scan_result = "Hello";
      *adv_data = 42;
    }
    
    void foobar(cback foo, scan_results *scan_result, uint8_t *adv_data) {
      (foo)(scan_result, adv_data);
      // access the arguments
      printf("Inside foobar(): scan_result = %s, adv_data = %d\n", *scan_result, 
          *adv_data); 
    }
    
    int main() {
      scan_results sr;
      uint8_t data;
      // I give my_cback to a function as an input.
      foobar(my_cback, &sr, &data);
      // access the arguments
      printf("Inside main():   scan_result = %s, adv_data = %d\n", sr, data);
    }
    

    输出

    Inside foobar(): scan_result = Hello, adv_data = 42
    Inside main():   scan_result = Hello, adv_data = 42
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 2018-03-23
      • 1970-01-01
      相关资源
      最近更新 更多