以下宏出现在 include/linux/kernel.h 中
#define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
我不明白第二个 & 应用于 __here 会做什么。第一个获取本地标签的地址,但是第二个呢?
以下宏出现在 include/linux/kernel.h 中
#define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
我不明白第二个 & 应用于 __here 会做什么。第一个获取本地标签的地址,但是第二个呢?
第二个&
in&&
是使 GCC 将名称作为标签而不是变量查找所必需的。例如
foo: ;
int foo;
void *p1 = &&foo;
void *p2 = &foo;
第二个初始化器引用 int 变量。
我认为&&
是获取标签的地址。
这是 gcc 扩展,我认为 C99 标准不支持这种行为。
在你的情况下,
#define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })
在实际代码_THIS_IP_
中将替换为块作用域下面的代码
{ __label__ __here;
__here:
(unsigned long) &&__here;
}
您正在声明本地标签__here
。因此,要获取我们使用的标签的地址,&&
而我们使用 single 获取变量的地址&
。