2015-07-21 80 views
1

this example header file 63线有一个typedef:alsa-lib - 无法找到结构定义。低级别的设计模式?

typedef struct _snd_ctl_elem_info snd_ctl_elem_info_t; 

有像透视代码类型定义的多个例子。 我的目标是去结构_snd_ctl_elem_info的实际定义,但我已经grepped源和谷歌搜索,但没有发现实际定义的痕迹。由于搜索失败,我开始认为我可能错过了一些概念,这可能与内核和向后兼容性有关。

我的动机是为了能够通过alsa进行gdb,并对结构进行概述。

这是一种低级结构定义模式吗?

回答

1

这个结构也被alsa-lib用来与内核通信,所以它只是重用了内核的定义。

内核头文件将安装为/usr/include/sound/asound.h,但为了避免依赖于正确安装的内核头文件,alsa-lib在alsa-lib/include/sound/asound.h中有自己的该文件副本。

应用程序不应该直接访问这个结构的成员,所以ALSA-lib中确实包括从它的官方标题asound.h(甚至不安装它,编译ALSA-lib中时,它仅使用)。

要获得实际的定义,您需要#include <sound/asound.h>

1

这听起来像它会从一个typedef改名为:

#define _snd_ctl_elem_info sndrv_ctl_elem_info 

所以你要找sndrv_ctl_elem_info,这是比较容易的方式找到。

它在asound.h定义的行809

It's pretty massive,所以我不会在这里贴上。

+0

谢谢,仍然试图弄清楚它是如何在'control.h'中变得可用的,以及为gdb识别结构的内容。 – TheMeaningfulEngineer

0

它在API header snd/asound.h中定义。这是客户端代码#include

+0

不,客户端代码不应该包含此内容。 –

+0

那么为什么内核应该导出这个头文件呢?可能*客户端代码*的字太宽.. –

+0

您链接的文件不能包含在应用程序中。内核头只用于使用内核'ioctl()'API的代码。 –