【问题标题】:Meaning of && in the context of bitwise_cast<void*>(&&__opcode);bitwise_cast<void*>(&&__opcode); 上下文中 && 的含义;
【发布时间】:2015-02-11 07:18:09
【问题描述】:

我正在查看下面来自 JavascriptCore 的代码,但我不知道 && 在下面的上下文中是什么意思。一个地址的地址并没有真正的意义。

那么有人可以解释一下 && 在下面的上下文中是什么意思吗?

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

下面的代码在 clang(可能是 gcc)上编译,但不能在我们自己的专有 C++ 编译器上编译。

完整的源码可以在here找到。

#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

【问题讨论】:

  • stackoverflow.com/questions/4549151/c-double-address-operator 可能重复? (如果没有,如果您还没有,您可能需要调查一下)
  • @ChrisSprague:不,这是在类型说明符中使用 &amp;&amp; 的不同用法,表示 rvalue 引用。在这里,它被用作表达式中的运算符。
  • @MikeSeymour Yikes - 这对 C++ 中的&amp;&amp; 做了 3 种完全不同的解释。可怕的!感谢您的澄清。
  • @ChrisSprague:标准 C++ 中只有两个,因为这是一个扩展。但是&amp;有三种含义。以及static的几种含义。

标签: c++ webkit


【解决方案1】:

这是一个 GCC 扩展:computed goto

给定一个goto 标签

label:

在标准C++中,只能直接跳转:

goto label;

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

void * ptr = &&label;

稍后再使用该指针:

goto *ptr;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 2019-09-18
    • 2011-03-30
    • 2014-04-01
    • 1970-01-01
    相关资源
    最近更新 更多