我遇到了一段代码void *p = &&abc;
。 &&
在这里有什么意义?
我知道rvalue引用但我认为在这种情况下使用的&&
是不同的。 &&
在void *p = &&abc;
中表示什么?
答案 0 :(得分:154)
答案 1 :(得分:96)
这是标签的地址,它是GCC特有的功能。
int main(void) {
void* startp;
s:
startp = &&s;
printf("the assignment above starts at address %p\n", startp);
return 0;
}
你可以通过测试自己弄清楚:
int main(void) {
void* startp;
int a;
startp = &&a;
printf("startp=%p\n", startp);
return 0;
}
GCC在这种情况下说:
错误:标签'a'已使用但未定义
你需要知道汇编程序才能真正理解这一点,但我会试着解释一下标签的地址是什么意思。
操作系统从磁盘加载.exe文件后,操作系统的一个组件称为“加载器”(Windows有“PE加载器”,linux有“ELF加载器”或者甚至是其他组件,如果它们是在内核中编译),它对该程序进行“虚拟化”,将其转化为一个过程。
这个过程认为它是RAM中唯一的一个,它可以访问整个RAM(即32位机器上的0x00000000-0xFFFFFFFF)。
(以上只是对发生的事情的简短描述,你真的需要学习装配才能完全理解它,所以请耐心等待)
现在,源代码中的标签基本上是一个地址。 “转到标签;”除了跳转到该地址之外别无其他(考虑汇编中的instruction pointer)。此标签存储此RAM地址,您可以通过该地址找到该地址。
在您学习ASM之后,您将意识到该地址指向可执行文件的.text
部分中的指令。 .text
部分是保存程序(二进制)代码的部分。
您可以使用以下方式进行检查:
objdump -x a.out
如GCC中所述,您可以使用它来初始化跳转表。一些scanner generators类re2c(请参阅-g
参数)使用它来生成更紧凑的扫描仪。也许有一个parser generator使用相同的技术。