这是来自CSR8670蓝牙芯片的库函数的头文件
typedef struct TaskData { void (*handler)(Task, MessageId, Message); } TaskData;
这是什么类型的结构声明?此结构的成员数据是什么? 以下是上下文的完整头文件:
/* This file was automatically generated from syscalls.in 17.2 */
#ifndef __MESSAGE__H
#define __MESSAGE__H
#include <csrtypes.h>
/*! @file message_.h @brief Message types */
/*!
Message identifier type.
*/
typedef uint16 MessageId;
/*!
Message delay type.
*/
typedef uint32 Delay;
/*!
Message type.
*/
typedef const void *Message;
/*!
Task type.
*/
typedef struct TaskData *Task;
/*!
TaskData type.
*/
typedef struct TaskData { void (*handler)(Task, MessageId, Message); } TaskData;
#endif
我仍然不确定*处理程序的含义。我无法在其他头文件中找到对handler的任何其他引用。如果相关,则Task表示在固件上运行的一种例程,该例程接受并处理固件可能从外部源接收的消息(例如,尝试连接到CSR板的蓝牙设备)。
答案 0 :(得分:2)
struct TaskData
只有一个函数指针成员,它是
void (*handler)(Task, MessageId, Message);
答案 1 :(得分:2)
handler
是指向函数的指针,该函数返回void
并且参数的类型为Task
,MessageId
和{{1}按顺序。
Message
是包含该成员的结构。
某些库函数可能会使用它来调用该库的 user 必须定义的函数。 (这些被称为回调函数,在C中是惯用的。)
答案 2 :(得分:1)
void (*handler)(Task, MessageId, Message);
这是一个函数指针,它是结构struct TaskData
的唯一成员。
函数指针是指向应该具有
的函数的指针void
。 Task
,MessageId
,Message
类型的三个输入参数,它们又是typedef
个。编辑:
用法的
如下面的评论中提到的,对于变量TaskData task;
,访问应该是[在伪代码中]
// void somefunc(Task t, MessageId mid, Message m) is the function
task.handler = somefunc;
和
Task p;
MessageId q;
Message r;
task.handler(p,q,r);
//function somefunc() will be called with argument p, q,and r
答案 3 :(得分:1)
typedef struct TaskData { void (*handler)(Task, MessageId, Message); } TaskData;
此结构的唯一成员是:
void (*handler)(Task, MessageId, Message);
,即一个名为handler
的函数指针,它可以指向一个返回void
&amp;的函数。接受Task
,MessageId
和Message
可以这样访问:例如:
typedef struct
{
void (*hand)(int a);
} str;
void func(int a)
{
printf("Value of a = %d\n", a);
}
int main ()
{
str var;
var.hand = func;
var.hand(25);
return 0;
}
答案 4 :(得分:1)
结构中的任何东西都是它的成员。 handler
是一个指向函数的函数指针,该函数接受类型Task, MessageId, Message
的三个参数并返回void
。这是结构的一员。
结构中函数指针的主要用途是用C来获得多态性(虚函数)的面向对象特征。