¿Alguien puede decirme cómo activar RTTI en C ++ cuando trabajo 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 aCC
compilador en HPUX.
Vijay
¿Alguien puede decirme cómo activar RTTI en C ++ cuando trabajo 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 aCC
compilador en HPUX.
vladr
Estas 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
Creo que HPUX aCC
/aC++
también tiene RTTI activado de forma predeterminada, y no conozco una forma de desactivarlo. Controlar su man
paginas.
Estoy usando el compilador aCC (ansi c) para compilar mis programas C++.
– Vijay
14 de abril de 2010 a las 5:57
gcc lo tiene activado de forma predeterminada. Comprueba si typeid(foo).name() te da 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
De acuerdo a los documentos no hay opción para apagarlo. Los únicos dos bits de C++ estándar que se pueden deshabilitar selectivamente son “alcance de variables en bucles for” (-Wc,ansi_for_scope,off
) y Búsqueda de nombres dependiente del argumento (-Wc,-koenig_lookup,off
). No hay una opción similar a -Wc,-RTTI,off
Todos los compiladores modernos de C ++ que conozco (GCC, Intel, MSVC, SunStudio, aCC) tienen RTTI habilitado de manera predeterminada, por lo que, a menos que tenga sospechas de que puede estar deshabilitado por algún motivo, puede asumir con seguridad que RTTI está activado.
RTTI se habilitará o deshabilitará al compilar su programa a través de las opciones del compilador; no es algo habilitado o deshabilitado en el entorno Unix a nivel mundial. La forma más fácil de ver si está habilitado de forma predeterminada para su compilador es simplemente intentar compilar algún código usando RTTI.
Las opciones para habilitar/deshabilitar RTTI serán específicas del compilador: ¿qué compilador está utilizando?
La compatibilidad con RTTI está activada de forma predeterminada en GCC, la opción -fno-rtti
desactiva el soporte (en caso de que esté utilizando GCC y tal vez alguien haya desactivado RTTI en un archivo MAKE o algo así).
0009laH
Habilitar y deshabilitar RTTI debe ser una configuración específica del compilador. para que el dynamic_cast<>
operación, la typeid
operador o excepciones para trabajar en C++, RTTI debe estar habilitado. Si puede compilar el siguiente código, 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;
}
emsr
En g++ puedes probar la __GXX_RTTI
macro para ver si RTTI está activado en su código. Como han señalado otros -no-rtti gira de RTTI en g++. Apuesto a que ambas 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 nuevo C++ tendremos acceso a macros de prueba de características __cpp_rtti
y muchos otros que te facilitarán estas cosas.