以下代码如何工作?

时间:2011-03-08 19:16:27

标签: c++ templates v8

    #define TYPE_CHECK(T, S)                                     \
    while (false) {                                              \
      *(static_cast<T* volatile*>(0)) = static_cast<S*>(0);      \
    }

我正在阅读Google v8的代码,并找到了上面的宏进行类型检查。

但是,我不明白为什么会这样。虽然(假)永远不会被执行,对吧? 有人可以解释这些线吗? 谢谢

2 个答案:

答案 0 :(得分:12)

相当奇特的黑客 - 宏的目的似乎是检查类型S是否可分配给T类型(即,是其子类)。如果不是,则从S*转换为T*的指针将产生编译器错误。 while (false)会阻止代码实际产生任何其他影响。

答案 1 :(得分:7)

是的,但编译器仍然执行语法&amp;循环内容的语义检查。因此,如果出现问题(即从S*T*的隐式类型转换是非法的,如果T既不是S也不是基类{{1} }),编译失败。否则,生成的机器代码的质量不会受到影响,因为优化器将检测到无法访问的代码并以静默方式将其删除。