在看linux内核代码的时候,经常会看到一些诡异的宏定义例如下面这种类型的宏定义
- #define __rcu_access_pointer(p, space) \
-
({ \
-
typeof(*p) *_________p1 = (typeof(*p)*__force )ACCESS_ONCE(p); \
-
rcu_dereference_sparse(p, space); \
-
((typeof(*p) __force __kernel *)(_________p1)); \
-
})
这个东西看得特别诡异,大概知道是什么意思。那个时候还差异,这个东西到底返回什么值呢,今天没事就在自己的机器上写了个简单的程序试了试这种诡异的宏定义。
示例代码如下:
- #include <stdio.h>
-
-
int main(int argc, char *argv[])
-
{
-
int a = 100;
-
int b =
-
({
-
typeof(a) _a = 10;
-
typeof(a) _c = 20;
-
_a;
-
_c;
-
});
-
-
printf("b=%d\n", b);
-
return 0;
-
}
编译无任何错误,可成长编译过,说明语法没有问题。
运行结果
首先从这个实验能够得到以下几点:
1.C语言中支持typeof关键字用来获得变量的类型。因为变量在编译时能够静态的获得类型,所以想要支持typeof应该在编译器实现上并不复杂。
2.使用({})这个结构的返回值是其中{}里最后一条语句的返回值。如果({})中只有一条定义语句,则无返回值,程序编译出错。
3.OK,以后在看内核代码时候就可以确定这诡异的宏定义到底是什么意思了。
阅读(2724) | 评论(0) | 转发(1) |