Как работает следующий код?
#define TYPE_CHECK(T, S) \
while (false) { \
*(static_cast<T* volatile*>(0)) = static_cast<S*>(0); \
}
Я читаю Google v8 код и нашел указанный макрос для проверки типа.
Однако я не понимаю, почему это работает. while (false) никогда не выполняются, не так ли?
Может кто-нибудь объяснить эти строки?
Спасибо
Ответы
Ответ 1
Да, но компилятор все еще выполняет синтаксические и семантические проверки содержимого цикла. Так что если что-то не так (т.е. Неявное преобразование типа от S*
до T*
является незаконным, что происходит, если T
не является ни S
, ни базовым классом S
), компиляция не выполняется. В противном случае качество полученного машинного кода не будет затронуто, так как оптимизатор обнаружит недостижимый код и тихонько удалит его.
Ответ 2
Довольно фантастический взлом - цель макроса заключается в том, чтобы проверить, может ли тип S
присваиваться (т.е. является подклассом) типа T
. Если это не так, то указатель, отбрасываемый от S*
до T*
, выдает ошибку компилятора. while (false)
предотвращает фактический эффект кода.