Как работает следующий код? - PullRequest
24 голосов
/ 08 марта 2011
    #define TYPE_CHECK(T, S)                                     \
    while (false) {                                              \
      *(static_cast<T* volatile*>(0)) = static_cast<S*>(0);      \
    }

Я читаю код Google v8 и обнаружил приведенный выше макрос для проверки типа.

Однако я не понимаю, почему он работает.в то время как (ложь) никогда не выполняется, верно?Может кто-нибудь объяснить эти строки?Спасибо

Ответы [ 2 ]

12 голосов
/ 08 марта 2011

Довольно необычный взлом - похоже, что целью макроса является проверка, присваивается ли тип S (т.е. является подклассом) типу T. Если это не так, указатель, приведенный от S* к T*, выдаст ошибку компилятора. while (false) препятствует тому, чтобы код фактически имел любой другой эффект.

7 голосов
/ 08 марта 2011

Да, но компилятор все еще выполняет синтаксические и семантические проверки содержимого цикла. Таким образом, если что-то не так (то есть неявное преобразование типа из S* в T* недопустимо, что происходит, если T не является ни S, ни базовым классом S), компиляция завершится неудачно. В противном случае на качество полученного машинного кода это не повлияет, так как оптимизатор обнаружит недоступный код и удалит его без вывода сообщений.

...