代码的调用流程 - C

时间:2014-04-24 07:10:06

标签: c function pointers

我正在研究微控制器的一些C代码。我理解大部分代码但是这部分代码令我感到困惑。 我还包括使用数据类型的相关定义。为了方便起见,我已经替换了函数和变量名。

#define COUNT           (2)    
typedef void(*some_type)(void *p);
some_type       some_arr[COUNT] = {NULL, };            

void init(void)
{
    first_function(&second_function);
}

void first_function(some_type cb)
{
    if(some_arr_count < COUNT)
    {
         some_arr[some_arr_count++] = cb;
    }
}

void second_function(void *p)
{
    another_type *req;
    req = (another_type *)p;
    //some other code goes here
}

1.此typedef意味着什么?

typedef void(*some_type)(void *p);

init()函数只被调用一次,它只有一行代码。

2.这条线做什么?

first_function(&second_function);

我在整个项目代码中搜索了术语second_function,这是除了函数定义之外唯一出现的地方。

3.那么second_function如何被调用?

2 个答案:

答案 0 :(得分:1)

首先,正如评论中所建议的那样,您应该阅读有关函数指针的内容。我从谷歌搜索中得到了这个(How do function pointers in C work?)。

上面的链接应该有助于解释问题1和2的答案。对于问题3,微控制器可能有一些内置机制或库函数调用{{1中的所有函数回调函数以下内容可能有效(未经测试):

some_arr[COUNT]

其中for (int i = 0; i < COUNT; ++i) { if (some_arr[i] == NULL) break; (*some_arr[i])(&something_useful); } 是回调函数可以使用的某种数据。

如果您能够搜索库代码以使用something_useful,您可能会找到调用some_arr的代码(尽管它不再被称为second_function)。

答案 1 :(得分:1)

  1. 以下typedef

    typedef void(*some_type)(void *p);
    

    some_type定义为指向void ()(void *)类型函数的指针。

  2. 以下陈述

    first_function(&second_function);
    

    是一个函数调用&second_function,它是second_function的地址,是first_function()的参数。

  3. 可以像这样调用函数second_function

    some_arr[some_arr_count](p);
    

    some_arr[some_arr_count]second_function的函数指针,在first_function中分配,psecond_function的参数,是void的指针{{1}}。