&&是什么意思在void * p = && abc;

我遇到了一段代码void *p = &&abc;&&在这里有什么意义? 我知道右值引用,但我认为&&在这种情况下使用是不同的。 &&void *p = &&abc;指示什么void *p = &&abc;

&&是gcc的扩展名,用于获取当前函数中定义的标签的地址。

void *p = &&abc在标准C99和C ++中是非法的。

这与g ++编译。

如何find它

这是标签的地址,这是GCC特有的function。

 int main(void) { void* startp; s: startp = &&s; printf("the assignment above starts at address %p\n", startp); return 0; } 

你可以通过testing自己弄明白:

 int main(void) { void* startp; int a; startp = &&a; printf("startp=%p\n", startp); return 0; } 

在这种情况下海合会说:

错误:使用但未定义的标签“a”

在引擎盖下 – assembly

你需要知道汇编器才能真正理解这个,但是我会试着解释一下标签的地址是什么意思。

操作系统从磁盘加载.exe文件后,操作系统的一个组件称为“加载程序”(窗口有“PE加载程序”,Linux有“ELF加载程序”或甚至其他人,如果他们编译内核),它会对该程序进行“虚拟化”,将其变成一个进程。

这个过程认为它是RAM中唯一的一个,它可以访问整个RAM(即32位机器上的0x00000000-0xFFFFFFFF)。

(以上只是对发生的一个简短的总结,你真的需要学习大会来充分理解它,所以请忍受我)

现在,源代码中的标签基本上是一个地址。 “goto标签” 除了跳转到那个地址外别的什么都没有(想想汇编中的指令指针 )。 这个标签存储这个RAM地址,这就是你如何find这个地址。

在学习ASM之后,您会意识到该地址指向可执行文件的.text部分中的指令。 .text部分是保存你的程序(二进制)代码来执行的部分。

你可以检查这个:

objdump -x a.out

一个实际的例子

如GCC所述 ,您可以使用它来初始化一个跳转表。 一些像re2c这样的扫描发生器 (请参阅-g参数)使用它来生成更紧凑的扫描仪。 也许甚至有一个parsing器生成器使用相同的技术。