2011-03-08 69 views
24
#define TYPE_CHECK(T, S)          \ 
    while (false) {            \ 
     *(static_cast<T* volatile*>(0)) = static_cast<S*>(0);  \ 
    } 

我在阅读Google v8的代码,发现上面的宏用于类型检查。下面的代码是如何工作的?

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

+3

这是两种类型的编译时检查,将两个空指针的内容分配给另一个空指针。编译器会检测类型的不兼容性(并停止编译)。由于条件中的错误值,代码将**执行(由于)。 – 2011-03-08 19:20:43

+0

真的很整洁..这是现在我的箱子! – JoeSlav 2011-03-08 19:25:52

+0

是否有任何理由使用'while'而不是'if'? – Jexcy 2011-03-08 19:26:32

回答

7

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

+2

演员们总是合法的。代码正在测试是否存在从'S *'到'T *'的标准转换。 ('T'可能是'S'的基类。) – aschepler 2011-03-08 19:24:20

+0

刚刚意识到,编辑。 – 2011-03-08 19:24:51

12

非常奇特的破解 - 宏的目的似乎是检查类型S是否可指派给T类型(即其子类)。如果不是,则从S*转换为T*的指针将产生编译器错误。 while (false)防止代码实际上有任何其他影响。