这个内核代码是什么意思?

时间:2015-08-12 10:55:55

标签: c linux linux-kernel

我在旧的内核代码中找到了这个:

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;}); 构造)中隐藏多个表达式的含义?

2 个答案:

答案 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;}) ); 
                 ^