¿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
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.
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.
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