在Google V8 Javascript引擎的V8.h中,有一段代码可以检查两个类型在编译阶段是否匹配。我可以理解其中很大一部分,但无法理解static_cast<T* volatile*>
的语法,添加不寻常的 volatile * 是什么意思,为什么需要呢?
#define TYPE_CHECK(T, S) \
while (false) { \
*(static_cast<T* volatile*>(0)) = static_cast<S*>(0); \
}
我注意到下面这个主题已经讨论过相同的代码,但是我没有详细讨论过这个问题。 How does the following code work?
答案 0 :(得分:6)
T* volatile*
表示&#34;指向volatile
指向T
&#34;的指针。因此它与T**
相同,只是在取消引用时,生成的左值为volatile
。
至于为何需要volatile
,请在提交说明中说明,您可以在此处查看:https://github.com/v8/v8/commit/35a80e16241308b4f476875d0f96282cf697a029
v8.h中的TYPE_CHECK应该分配给volatile限定的空指针。
除非指针是volatile限定的,否则Clang会警告LLVM 在优化期间删除分配。这不是问题所在 该代码永远不应该执行,但警告被视为错误 在构建Chromium时,从而停止构建。