我正在查看下面的代码来自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)
这是一个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语句而不是计算跳转标签的方案.