C中奇怪的结构声明方法

时间:2014-12-31 10:19:56

标签: c struct

这是来自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板的蓝牙设备)。

5 个答案:

答案 0 :(得分:2)

struct TaskData只有一个函数指针成员,它是

void (*handler)(Task, MessageId, Message);

答案 1 :(得分:2)

handler是指向函数的指针,该函数返回void并且参数的类型为TaskMessageId和{{1}按顺序。

Message是包含该成员的结构。

某些库函数可能会使用它来调用该库的 user 必须定义的函数。 (这些被称为回调函数,在C中是惯用的。)

答案 2 :(得分:1)

void (*handler)(Task, MessageId, Message);

这是一个函数指针,它是结构struct TaskData的唯一成员。

函数指针是指向应该具有

的函数的指针
  • 返回类型为void
  • 分别为TaskMessageIdMessage类型的三个输入参数,它们又是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;的函数。接受TaskMessageIdMessage

类型的参数

可以这样访问:例如:

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来获得多态性(虚函数)的面向对象特征。

相关问题