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

Bre*_*ias 102 c c++ gcc operators

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

Pra*_*rav 154

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

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

用g ++编译.

  • 现在想象一下,如果gcc默认情况下,每个人都会有更好的表现.然后人们会学习C而不是关于gnus的无关信息. (42认同)
  • 什么是黑客.如果他们为标签指针发明了一种新语法,他们应该为它创建一个新类型,而不是使用`void*`. (4认同)
  • @Prasoon Saurav:无论谁投了反对票,都可能不赞成该功能,并把它发泄在你身上。 (2认同)

Fla*_*ius 96

如何找到它

这是标签的地址,它是GCC特有的功能.

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

您可以通过测试自己想出来:

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

GCC在这种情况下说:

错误:标签'a'已使用但未定义

引擎盖下 - 组装

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

操作系统从磁盘加载.exe文件后,操作系统的一个组件称为"加载器"(windows有"PE加载器",linux有"ELF加载器"或者甚至是其他组件,如果它们是在内核),它对该程序进行"虚拟化",将其转化为一个过程.

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

(以上只是对发生的事情的简短概述,你真的需要学习装配才能完全理解它,所以请耐心等待)

现在,源代码中的标签基本上是一个地址."转到标签;" 除了跳转到该地址之外别无其他(想想汇编中的指令指针).此标签存储此RAM地址,您可以通过该地址找到该地址.

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

你可以用以下方法检查:

objdump -x a.out

一个实际的例子

GCC中所述,您可以使用它来初始化跳转表.一些扫描仪生成re2c(见-g参数)使用,以产生更紧凑的扫描仪.也许甚至还有一个使用相同技术的解析器生成器.

  • 使用-std = c99 -pedantic进行编译. (4认同)
  • 非常重要的是,它是一个GCC扩展,而不是语言的核心部分 (2认同)