【发布时间】:2019-08-18 08:33:16
【问题描述】:
我正在查看 Linux 源代码,以下行看起来很奇怪。
(void) ( { .... ;} ) 构造可能有什么用?
#define GETCH(queue,c) \
(void)({c=(queue).buf[(queue).tail];INC((queue).tail);})
这是我的想法:
1. (void) 抑制一些编译器警告。
2. {....} 将两个语句组合在一起,以便它可以正确使用 while(...) GETCH(q,c);。
还有其他原因吗?有没有可用的文档?
【问题讨论】:
-
神奇的是外括号:gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html#Statement-Exprs "StatementExpressions" 是对 C 标准的扩展。
-
你是 100% 正确的
-
@AnttiHaapala:您不应该将其作为that question 的副本关闭。语句表达式扩展只回答了这个问题的一部分。显然,没有理由在这个宏中使用语句表达式:它只用大括号就可以执行相同的操作。宏形成一个语法实体,当它后跟分号时,形成一个语句,因此可以用来代替
if (X) S; else T;中的S,单独使用大括号则不成立。 -
那么你搜索正确的副本
-
@AnttiHaapala:或者我们可以回答这个问题。正确。
标签: c linux-kernel