¿Cómo funciona el siguiente código?


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

Estoy leyendo el código de Google v8 y encontré la macro anterior para la comprobación de tipo.

Sin Embargo, no entiendo por qué funciona. mientras que (falso) nunca ser ejecutado, ¿verdad? ¿Alguien puede explicar esas líneas? Gracias

Author: Byron Whitlock, 2011-03-08

2 answers

Sí, pero el compilador todavía realiza comprobaciones sintácticas y semánticas en el contenido del bucle. Así que si algo está mal (es decir, la conversión implícita de tipo de S* a T* es ilegal, lo que sucede si T no es ni S ni una clase base de S), la compilación falla. De lo contrario, la calidad del código de máquina resultante no se ve afectada ya que el optimizador detectará el código no alcanzable y lo eliminará en silencio.

 7
Author: Alexander Gessler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-08 19:21:19

Un truco bastante sofisticado - el propósito de la macro parece ser comprobar si el tipo S es asignable a (es decir, es una subclase de) el tipo T. Si no lo es, el puntero lanzado de S* a T* producirá un error de compilador. El while (false) evita que el código tenga realmente cualquier otro efecto.

 12
Author: Aasmund Eldhuset,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-08 19:21:57