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

我正在阅读 Google v8的代码,发现上面的宏用于类型检查。

但是,我不明白它为什么起作用。while(false) 永远不会被执行,对吧?有人可以解释这些线吗?谢谢

4

2 回答 2

12

相当花哨的 hack - 宏的目的似乎是检查类型S是否可分配给 type (即,是子类)T。如果不是,则从S*to 转换的指针T*将产生编译器错误。这while (false)可以防止代码实际产生任何其他影响。

于 2011-03-08T19:21:57.530 回答
7

是的,但编译器仍然对循环内容执行语法和语义检查。因此,如果出现问题(即从S*to的隐式类型转换T*是非法的,如果T既不是S也不是 的基类,就会发生这种情况S),编译将失败。否则,生成的机器代码的质量不会受到影响,因为优化器将检测到不可访问的代码并静默删除它。

于 2011-03-08T19:21:19.123 回答