#define TYPE_CHECK(T, S) \
while (false) { \
*(static_cast<T* volatile*>(0)) = static_cast<S*>(0); \
}
我在阅读Google v8的代码,发现上面的宏用于类型检查。下面的代码是如何工作的?
但是,我不明白它为什么起作用。 while(false)永远不会被执行,对吧? 有人可以解释这些行吗? 谢谢
#define TYPE_CHECK(T, S) \
while (false) { \
*(static_cast<T* volatile*>(0)) = static_cast<S*>(0); \
}
我在阅读Google v8的代码,发现上面的宏用于类型检查。下面的代码是如何工作的?
但是,我不明白它为什么起作用。 while(false)永远不会被执行,对吧? 有人可以解释这些行吗? 谢谢
是的,但编译器仍然执行语法检查循环内容的语法&。因此,如果出现问题(即从S*
到T*
的隐式类型转换是非法的,如果T
既不是S
也不是基类S
),编译失败。否则,由于优化器会检测到无法访问的代码并将其无提示地移除,因此生成的机器代码的质量不受影响。
演员们总是合法的。代码正在测试是否存在从'S *'到'T *'的标准转换。 ('T'可能是'S'的基类。) – aschepler 2011-03-08 19:24:20
刚刚意识到,编辑。 – 2011-03-08 19:24:51
非常奇特的破解 - 宏的目的似乎是检查类型S
是否可指派给T
类型(即其子类)。如果不是,则从S*
转换为T*
的指针将产生编译器错误。 while (false)
防止代码实际上有任何其他影响。
这是两种类型的编译时检查,将两个空指针的内容分配给另一个空指针。编译器会检测类型的不兼容性(并停止编译)。由于条件中的错误值,代码将**执行(由于)。 – 2011-03-08 19:20:43
真的很整洁..这是现在我的箱子! – JoeSlav 2011-03-08 19:25:52
是否有任何理由使用'while'而不是'if'? – Jexcy 2011-03-08 19:26:32