我正在查看下面来自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
答案 0 :(得分:9)
这是GCC的延伸:computed goto。
给出goto
标签
label:
在标准C ++中,你只能直接跳转到它:
goto label;
但GCC允许您使用&&
作为一元运算符(类似于&
的非标准使用来存储其地址,以获取对象,函数或成员的地址):< / p>
void * ptr = &&label;
稍后使用该指针:
goto *ptr;
看起来您可以通过预处理器禁用此功能,对于没有此扩展名的编译器。它将使用一些基于switch
语句而不是计算跳转标签的方案。