#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