首页 > 解决方案 > 定义宏中的尾随逗号

问题描述

我遇到了这段代码。

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

这个尾随逗号在 C 中是否在语法上有效?

标签: cc-preprocessor

解决方案


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

{
    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,是有效的。enum从 C99 开始,列表也是如此。像上面这样的宏观技巧是原因之一。


推荐阅读