我正在研究微控制器的一些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如何被调用?
答案 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)
以下typedef
typedef void(*some_type)(void *p);
将some_type
定义为指向void ()(void *)
类型函数的指针。
以下陈述
first_function(&second_function);
是一个函数调用&second_function
,它是second_function
的地址,是first_function()
的参数。
可以像这样调用函数second_function
some_arr[some_arr_count](p);
some_arr[some_arr_count]
是second_function
的函数指针,在first_function
中分配,p
是second_function
的参数,是void
的指针{{1}}。