我在旧的内核代码中找到了这个:
char
但我不明白我应该如何理解这一行的含义:
#define hlist_for_each_entry(tpos, pos, head, member) \
for (pos = (head)->first; \
pos && \
({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \
pos = pos->next)
编译器如何在braces /括号(({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;});
构造)中隐藏多个表达式的含义?
答案 0 :(得分:3)
看来这个建筑
({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;});
基于其自身的编译器语言扩展,允许在表达式中使用复合语句。它类似于C ++中的lambda表达式。
我认为评估结构的结果具有价值1.
在我看来,它只是一个糟糕的代码,因为可以使用逗号运算符(如
)编写相同的代码pos && ( ( tpos = hlist_entry(pos, typeof(*tpos), member) ), 1 ); \
pos = pos->next)
答案 1 :(得分:2)
它是GCC语言扩展,"支持组"在表达式中。
正如@nos在对另一个答案的评论中所说,GCC documentation解释了它。
表达式(EXP1; EXP2; ...; EXPn;)
的值为EXPn
。
您应该使用其他副作用 - 请参阅此示例:
#include <stdio.h>
int main() {
int b;
printf("%d\n", ({ b=3; 2;}) );
printf("%d\n",b);
exit(0);
}
如果使用GCC编译它而没有任何编译选项,例如,它将打印2,然后打印3。
但是使用-Wall -pedantic
进行编译迫使GCC严格遵循标准,拒绝标准允许的任何内容。它会告诉我们不允许这个扩展名:
gcc -Wall -pedantic a.c
a.c: In function ‘main’:
a.c:5:17: warning: ISO C forbids braced-groups within expressions [-Wpedantic]
printf("%d\n", ({ b=3; 2;}) );
^