&&在bitwise_cast<void*>(&&__opcode)上下文中的含义;
Meaning of && in the context of bitwise_cast<void*>(&&__opcode);
我正在查看下面来自JavascriptCore的代码,我不知道&&在下面的上下文中是什么意思。地址的地址实际上没有意义。
所以有人可以在下面的上下文中解释&&的含义。
(bitwise_cast使用联合来避免reinterpret_cast带来的严格混叠问题)
下面的代码在 clang(大概是 gcc)上编译,但不在我们自己的专有C++编译器上编译。
完整的来源可以在这里找到。
#if ENABLE(COMPUTED_GOTO_OPCODES)
Opcode* opcodeMap = LLInt::opcodeMap();
#define OPCODE_ENTRY(__opcode, length)
opcodeMap[__opcode] = bitwise_cast<void*>(&&__opcode); //<---- The double &&
FOR_EACH_OPCODE_ID(OPCODE_ENTRY)
#undef OPCODE_ENTRY
#define LLINT_OPCODE_ENTRY(__opcode, length)
opcodeMap[__opcode] = bitwise_cast<void*>(&&__opcode);
FOR_EACH_LLINT_NATIVE_HELPER(LLINT_OPCODE_ENTRY)
#undef LLINT_OPCODE_ENTRY
#endif
这是一个 GCC 扩展:计算 goto。
给定goto
标签
label:
在标准C++中,您只能直接跳转到它:
goto label;
但是 GCC 允许您使用非标准地使用 &&
作为一元运算符来存储其地址(类似于获取对象、函数或成员地址的 &
):
void * ptr = &&label;
并稍后使用该指针:
goto *ptr;
看起来您可以通过预处理器禁用此功能,对于没有此扩展的编译器。它将使用一些基于 switch
语句的方案,而不是计算的跳转标签。
相关文章:
- #为""定义宏;静态";针对不同的上下文
- 与互斥锁相比,旋转锁可以保证上下文切换
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 错误"Could not find Boost"(缺少:上下文标头)
- 使用 mod_gsoap 部署服务时,如何在 Gsoap 中更改 soap 上下文的模式?
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 安排带有上下文的协同程序
- 我的文件无法正常工作,无法从C++文件中读取上下文
- DCMTK 了解"DIMSE 没有有效的演示上下文 ID"错误
- 具有std::initializer_list参数的非成员函数(/non构造函数上下文)的重载解析
- antlr 规则上下文是否可以独立于目标
- OpenGL 调试上下文警告 -"将使用视频内存作为缓冲区异议的来源
- MSVC 在不知道类型的情况下评估上下文(和错误)
- 为什么 Perf 具有如此高的上下文切换?
- 非推导上下文,如标准库中的"boost::mpl::identity:<T>:type"?
- 使用 std::size 来自非 const 上下文
- 如何使用IExecuteCommand和动词在上下文菜单外壳扩展中显示本地化文本和自定义图标?