定义宏中的尾随逗号

trailing comma in define macro

我看到了这段代码。

#define LIST_ENTRY(_type)\
_type##_auth_detach,
static int (*func[])(int x) = 
{
    LIST_ENTRY(foo)
    0
};

这个尾随逗号在 C 语言中语法有效吗?

在这种情况下,它似乎只是一个数组初始值设定项列表,其中宏将列表扩展为:

{
    foo_auth_detach,
    0
};

其中逗号是使数组初始值设定项语法有效所必需的。在这种特定情况下,它没有多大意义 - LIST_ENTRY(foo), 更清楚。

但还有其他非常相似的情况,您希望通过使用“X-macros”将所有数据集中到一个地方来避免代码重复,并且有这样的事情:

#define LIST \
  X(foo)     \
  X(bar)     \

...

static int (*func[])(int x) = 
{
  #define X(_type) _type##_auth_detach,
    LIST
  #undef X
    0
};

扩展为

{
    foo_auth_detach,
    bar_auth_detach,
    0
};

在这种“X 宏”的情况下,, 不仅是最后一个 0 参数所必需的,而且对于列表中提供的每个参数也是必需的。

请注意,数组初始值设定项列表可能以尾随 , 结尾,因此 0, 是有效的。自 C99 以来,enum 列表也是如此。上面的宏技巧是原因之一。