activar RTTI en c++
hp-ux acc (7)
¿Alguien puede decirme cómo activar RTTI en c ++ cuando se trabaja en Unix? Escuché que se puede deshabilitar y habilitar. en mi entorno Unix, ¿cómo puedo verificar si RTTI está habilitado o deshabilitado?
Estoy usando el compilador aCC
en HPUX.
¿Estás usando g++
o algún otro compilador?
En g++
RTTI está habilitado por defecto IIRC, y puede deshabilitarlo con -fno-rtti
. Para probar si está activo o no, use dynamic_cast
o typeid
ACTUALIZAR
Creo que el aCC
/ aC++
HPUX también tiene RTTI activado por defecto, y no tengo conocimiento de una forma de desactivarlo. Revisa tus páginas man
.
En g ++ puedes probar la macro __GXX_RTTI
para ver si RTTI está activado en tu código. Como otros han señalado -no-rtti giros de RTTI en g ++. Apuesto que estas dos cosas también funcionan en clang.
#ifdef __GXX_RTTI
w = dynamic_cast<FooBah*>(FooFactory(TYPE, arg));
if (w != NULL)
{
if (w->thing == OK)
FeastOnOrangUtansAndFruitBatsAndBreakfastCereals();
}
#endif
En el C ++ más nuevo, tendremos acceso a las macros de prueba de características __cpp_rtti
y muchas otras que harán las cosas más fáciles.
La activación y desactivación de RTTI debe ser una configuración específica del compilador. Para que la operación dynamic_cast<>
, el operador typeid
o las excepciones funcionen en C ++, RTTI debe estar habilitado. Si puede obtener el siguiente código compilado, entonces ya tiene RTTI habilitado (que la mayoría de los compiladores, incluido g ++, hacen automáticamente):
#include <iostream>
#include <typeinfo>
class A
{
public:
virtual ~A () { }
};
class B : public A
{
};
void rtti_test (A& a)
{
try
{
B& b = dynamic_cast<B&> (a);
}
catch (std::bad_cast)
{
std::cout << "Invalid cast./n";
}
std::cout << "rtti is enabled in this compiler./n";
}
int
main ()
{
A *a1 = new B;
rtti_test (*a1); //valid cast
A *a2 = new A;
rtti_test (*a2); //invalid cast
return 0;
}
RTTI se habilitará o deshabilitará al compilar su programa a través de las opciones del compilador; no se trata de algo habilitado o deshabilitado en el entorno de Unix a nivel mundial. La forma más fácil de ver si está habilitado de manera predeterminada para su compilador es simplemente intentar compilar algún código con RTTI.
Las opciones para habilitar / deshabilitar RTTI serán específicas del compilador: ¿qué compilador estás usando?
El soporte RTTI está activado por defecto en GCC, la opción -fno-rtti
desactiva el soporte (en caso de que esté usando GCC y quizás alguien haya apagado RTTI en un archivo MAKE o algo así).
Según los documentos, no hay opción para desactivarlo. Los únicos dos bits de C ++ estándar que pueden desactivarse selectivamente son "alcance de variables en bucles for" ( -Wc,ansi_for_scope,off
) y Argument-Dependent Lookup de nombres ( -Wc,-koenig_lookup,off
). No hay ninguna opción similar a -Wc,-RTTI,off
Todos los compiladores modernos de C ++ que conozco (GCC, Intel, MSVC, SunStudio, aCC) tienen RTTI activado por defecto, así que a menos que tengas sospechosos de que pueda ser desactivado por alguna razón, puedes asumir que RTTI está encendido.
gcc lo tiene activado por defecto. Compruebe si typeid (foo) .name () le ofrece algo útil.
#include <iostream>
#include <typeinfo>
int main()
{
std::cout << typeid(int).name() << std::endl;
return 0;
}
Sin RTTI, obtienes algo como:
foo.cpp:6: error: cannot use typeid with -fno-rtti