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; 中的 && 是啥意思的主要内容,如果未能解决你的问题,请参考以下文章