和&amp;&amp;的含义在bitwise_cast <void *>(&amp;&amp; __ opcode); </void *>的上下文中

时间:2014-12-12 14:42:31

标签: c++ webkit

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

所以有人可以解释&amp;&amp;和在下面的上下文中表示。

(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

1 个答案:

答案 0 :(得分:9)

这是GCC的延伸:computed goto

给出goto标签

label:

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

goto label;

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

void * ptr = &&label;

稍后使用该指针:

goto *ptr;

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