在&bitlo_cast <void*>(&& __ opcode)的上下文中&&的含义;

dor*_*ron 4 c++ webkit

我正在查看下面的代码来自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
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 9

这是一个GCC扩展:计算goto.

给出一个goto标签

label:
Run Code Online (Sandbox Code Playgroud)

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

goto label;
Run Code Online (Sandbox Code Playgroud)

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

void * ptr = &&label;
Run Code Online (Sandbox Code Playgroud)

并在以后使用该指针:

goto *ptr;
Run Code Online (Sandbox Code Playgroud)

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