4

以下宏出现在 include/linux/kernel.h 中

#define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&&__here; })

我不明白第二个 & 应用于 __here 会做什么。第一个获取本地标签的地址,但是第二个呢?

4

2 回答 2

5

第二个&in&&是使 GCC 将名称作为标签而不是变量查找所必需的。例如

foo: ;
int foo;

void *p1 = &&foo;
void *p2 = &foo;

第二个初始化器引用 int 变量。

于 2012-12-16T14:54:28.777 回答
4

我认为&&是获取标签的地址。

这是 gcc 扩展,我认为 C99 标准不支持这种行为。

有关更多信息,请参见.. gcc 标签和值

本地标签声明

在你的情况下,

#define _THIS_IP_ ({ __label__ __here; __here: (unsigned long)&&__here; })

在实际代码_THIS_IP_中将替换为块作用域下面的代码

{ __label__ __here;
 __here: 
(unsigned long) &&__here; 
}

您正在声明本地标签__here。因此,要获取我们使用的标签的地址,&&而我们使用 single 获取变量的地址&

于 2012-12-16T14:56:18.370 回答