C 访问已声明函数的参数

C 访问已声明函数的参数,c,function,callback,typedef,C,Function,Callback,Typedef,我有以下功能声明: typedef void (cback) (scan_results *scan_result, uint8_t *adv_data); 我声明函数如下: cback my_cback; 我将my_cback作为一个函数的输入。然后,我想访问my\cback的参数。如何实现这一点?使用我的VC2008可以编译并运行以下内容: typedef void (cback) (int *scan_result, int *adv_data); void f(int *scan_

我有以下功能声明:

typedef void (cback) (scan_results *scan_result, uint8_t *adv_data);
我声明函数如下:

cback my_cback;

我将
my_cback
作为一个函数的输入。然后,我想访问
my\cback
的参数。如何实现这一点?

使用我的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
我将
my_cback
作为输入提供给函数。
然后,我想访问我的_cback的参数。我怎样才能做到这一点

传递给函数(
foobar()
),不仅传递给
my\u cback
,还传递给
my\u 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);
}

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