&&是什么意思在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器生成器使用相同的技术。