首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bitwise_cast<void*>(&&__opcode)语境中&的意义;

Bitwise_cast<void*>(&&__opcode)语境中&的意义;
EN

Stack Overflow用户
提问于 2014-12-12 14:42:31
回答 1查看 288关注 0票数 4

下面是来自JavascriptCore的代码,我不知道&&在下面的上下文中有什么意义。地址的地址没有实际意义。

因此,有人能在下面的上下文中解释&的含义。

( bitwise_cast使用联合来避免reinterpret_cast带来的严格混叠问题)

下面的代码是在clang (大概还有gcc)上编译的,而不是在我们自己的专有C++编译器上编译的。

完整的源代码可以找到这里

代码语言:javascript
复制
#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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-12 14:46:53

这是GCC的分机:计算goto

给定goto标签

代码语言:javascript
复制
label:

在标准C++中,您只能直接跳到它:

代码语言:javascript
复制
goto label;

但是GCC允许您使用&&作为一元运算符(类似于获取对象、函数或成员的地址的& )的非标准用法来存储其地址:

代码语言:javascript
复制
void * ptr = &&label;

稍后使用该指针:

代码语言:javascript
复制
goto *ptr;

看起来您可以通过预处理器禁用它,因为您的编译器没有这个扩展名。它将使用一些基于switch语句的方案,而不是计算跳转标签。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27446016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档