c - 定义宏中的尾随逗号
问题描述
我遇到了这段代码。
#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,
是有效的。enum
从 C99 开始,列表也是如此。像上面这样的宏观技巧是原因之一。
推荐阅读
- tensorflow - ValueError:两个形状中的维度 0 必须相等,但分别为 10 和 1。形状为 [10] 和 [1]
- javascript - PHP FOREACH LOOP FOR SELECT OPTION 在 JQUERY INSIDE PHP
- graphql - 使用 MDX 在 Gatsby 博客中添加 featuresImage
- performance - 如何在 Elasticsearch 和 Python 中初始化标签数组列表
- bash - 从 .bashrc 或 .zshrc 修改现有函数
- javascript - 如何将不同时区的时间更改为 IST 到 CEST
- c# - Visual Studio 中的 C# for 循环
- spring-boot - 当我使用 @Sql 进行 Spring 测试时发生 FileNotFoundException
- python - 列表中的最大频率
- javascript - 如何通过在文本输入上按 Enter 来触发功能(React)