activar RTTI en c++

3 minutos de lectura

avatar de usuario
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.

avatar de usuario
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

ACTUALIZAR

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í).

avatar de usuario
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;
}

avatar de usuario
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.

¿Ha sido útil esta solución?