Подтвердить что ты не робот

Как работает следующий код?

    #define TYPE_CHECK(T, S)                                     \
    while (false) {                                              \
      *(static_cast<T* volatile*>(0)) = static_cast<S*>(0);      \
    }

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

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

4b9b3361

Ответ 1

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

Ответ 2

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