&&在bitwise_cast<void*>(&&__opcode)上下文中的含义;

Meaning of && in the context of bitwise_cast<void*>(&&__opcode);

本文关键字:上下文 opcode bitwise cast lt gt void      更新时间:2023-10-16

我正在查看下面来自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 语句的方案,而不是计算的跳转标签。