什么和&&无效的意思* p =&& abc;

时间:2011-05-24 06:22:35

标签: c++ c gcc operators

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

2 个答案:

答案 0 :(得分:154)

&& is gcc's extension获取当前函数中定义的标签的地址。

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

This使用g ++编译。

答案 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 generatorsre2c(请参阅-g参数)使用它来生成更紧凑的扫描仪。也许有一个parser generator使用相同的技术。