定义宏中的尾随逗号
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
列表也是如此。上面的宏技巧是原因之一。
我看到了这段代码。
#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
列表也是如此。上面的宏技巧是原因之一。