我使用示例 C ALSA 程序作为参考,并运行以下代码:
...
snd_ctl_event_t *event;
snd_ctl_event_alloca(&event);
...
基于 ALSA 源代码,snd_ctl_event_alloca
是一个宏,调用__snd_alloca
which 是一个宏,最终扩展为以下等效行snd_ctl_event_alloca(&event);
(经过一些简单的简化):
event = (snd_ctl_event_t *) alloca(snd_ctl_event_sizeof());
memset(event, 0, snd_ctl_event_sizeof());
wheresnd_ctl_event_sizeof()
在整个库中只实现一次,如下所示:
size_t snd_ctl_event_sizeof()
{
return sizeof(snd_ctl_event_t);
}
所以我的问题是,这整个过程不等同于简单地做:
snd_ctl_event_t event = {0};
作为参考,这些是宏:
#define snd_ctl_event_alloca(ptr) __snd_alloca(ptr, snd_ctl_event)
#define __snd_alloca(ptr,type) do { *ptr = (type##_t *) alloca(type##_sizeof()); memset(*ptr, 0, type##_sizeof()); } while (0)
说明:
- 上面的第一个代码块位于函数体的开头,而不是嵌套块中
编辑
事实证明(据我了解),做:
snd_ctl_event_t event;
给出一个storage size of 'event' isn't known
错误,因为snd_ctl_event_t
显然是一个私有定义的不透明结构。因此,唯一的选择是动态分配。