void *p = &&abc; 中的 && 是啥意思

Posted

技术标签:

【中文标题】void *p = &&abc; 中的 && 是啥意思【英文标题】:What does && mean in void *p = &&abc;void *p = &&abc; 中的 && 是什么意思 【发布时间】:2011-08-31 16:18:42 【问题描述】:

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

【问题讨论】:

你在哪里看到的? 我也想知道你在哪里看到的。 【参考方案1】:

如何找到它

这是标签的地址,它是 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 采用了相同的技术。

【讨论】:

使用 -std=c99 -pedantic 编译。 值得一提的是,它是 GCC 扩展,而不是语言的核心部分 那是相当令人印象深刻的弗拉维乌斯。 我喜欢这种答案,需要教更多的人如何找到答案,而不仅仅是被告知。 感谢您的深入解释。感谢大会相关分析。【参考方案2】:

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

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

This 用 g++ 编译。

【讨论】:

现在想象一下,如果 gcc 默认有 -pedantic,每个人都会成为更好的程序员。然后人们会学习 C 而不是关于 gnus 的无关信息。 真是个黑客。如果他们为标签指针发明了一种新语法,他们也应该为它发明一种新类型,而不是使用void* @Prasoon Saurav:投反对票的人可能不赞成该功能并将其与您相提并论。 @Lundin:大多数编译器也是如此。 __forceinline? __declspec(naked)?我最喜欢的 MSVCism 之一是:template<typename T> class X friend T; ,这是无效的 C++03。 第二个链接失效了。

以上是关于void *p = &&abc; 中的 && 是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript中的“&nbsp”是啥意思

HTML连载20-并集选择器&兄弟选择器

c语言复合字面10

李喆第5次作业

Python中escape和unescape

一初级篇——指针(*)取地址(&)解引用(*)与引用(&)的区别