2011-03-08 51 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)防止代碼實際上有任何其他影響。

相關問題