什么是__flexarr以及c程序员如何/为何使用它?

时间:2014-02-05 21:58:57

标签: c

sys/inotify.hinotify.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语言非常不熟悉)。

我唯一知道的是你可以存储不同长度的字符串,但我完全不了解它是如何/为何起作用的。

有人在乎解释吗?感谢。

1 个答案:

答案 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
....

如果您正在编写新代码,那么标准强制使用它的方法只有[]