在sys/inotify.h
(inotify.h)中,定义了以下结构:
struct inotify_event
{
int wd; /* Watch descriptor. */
uint32_t mask; /* Watch mask. */
uint32_t cookie; /* Cookie to synchronize two events. */
uint32_t len; /* Length (including NULs) of name. */
char name __flexarr; /* Name. */
};
我在代码中找不到__flexarr
的任何定义。我在哪里搜索它?
在一个不相关的项目中,我发现#define __flexarr [1]
我认为它做了类似的事情,但这个定义对我来说没有多大意义(对C语言非常不熟悉)。
我唯一知道的是你可以存储不同长度的字符串,但我完全不了解它是如何/为何起作用的。
有人在乎解释吗?感谢。
答案 0 :(得分:9)
这是struct hack。 C99正式以“灵活阵列成员”的形式添加它。
作为一种特殊情况,结构的最后一个元素有多个 命名成员可能具有不完整的数组类型;这叫做a 灵活的阵列成员。在大多数情况下,灵活的阵列成员 被忽略了。特别是,结构的大小就像是 柔性阵列成员被省略,除了它可能有更多 尾随填充比遗漏意味着暗示。
我说sys/cdefs.h
:
#if __GNUC_PREREQ (2,97)
/* GCC 2.97 supports C99 flexible array members. */
# define __flexarr []
#else
# ifdef __GNUC__
# define __flexarr [0]
# else
....
如果您正在编写新代码,那么标准强制使用它的方法只有[]
。