web-dev-qa-db-fra.com

activer RTTI en c ++

Quelqu'un peut-il me dire comment activer RTTI en c ++ lorsque l'on travaille sur unix. J'ai entendu dire qu'il peut être désactivé et activé. sur mon environnement unix, comment puis-je vérifier si RTTI est activé ou désactivé?

J'utilise le compilateur aCC sur HPUX.

35
Vijay

Utilisez-vous g++ Ou un autre compilateur?

Dans g++ RTTI est activé par défaut IIRC, et vous pouvez le désactiver avec -fno-rtti. Pour tester s'il est actif ou non, utilisez dynamic_cast Ou typeid

METTRE À JOUR

Je crois que aCC/aC++ De HPUX a également RTTI activé par défaut, et je ne connais pas de moyen de le désactiver. Vérifiez vos man pages .

25
vladr

gcc l'a activé par défaut. Vérifiez si typeid (foo) .name () vous donne quelque chose d'utile.

#include <iostream>
#include <typeinfo>

int main()
{
 std::cout << typeid(int).name() << std::endl;
 return 0;
}

Sans RTTI, vous obtenez quelque chose comme:

foo.cpp:6: error: cannot use typeid with -fno-rtti
20
Eddy Pronk

Selon la documentation il n'y a pas d'option pour le désactiver. Les deux seuls bits du C++ standard qui peuvent être désactivés de manière sélective sont "l'étendue des variables dans les boucles for" (-Wc,ansi_for_scope,off) et la recherche dépendante de l'argument des noms (-Wc,-koenig_lookup,off). Il n'y a pas d'option similaire à -Wc,-RTTI,off

8
MSalters

Tous les compilateurs C++ modernes que je connais (GCC, Intel, MSVC, SunStudio, aCC) ont le RTTI activé par défaut, donc à moins que vous ne soupçonniez qu'il peut être désactivé pour une raison quelconque, vous pouvez supposer en toute sécurité que RTTI est activé.

6
Artyom

RTTI sera activé ou désactivé lors de la compilation de votre programme via les options du compilateur - ce n'est pas quelque chose d'activé ou de désactivé dans l'environnement Unix globalement. Le moyen le plus simple de voir s'il est activé par défaut pour votre compilateur est d'essayer simplement de compiler du code à l'aide de RTTI.

Les options pour activer/désactiver RTTI seront spécifiques au compilateur - quel compilateur utilisez-vous?

Le support RTTI est activé par défaut dans GCC, l'option -fno-rtti désactive la prise en charge (au cas où vous utilisez GCC et peut-être que quelqu'un a désactivé RTTI dans un makefile ou quelque chose du genre).

2
Michael Burr

L'activation et la désactivation de RTTI doivent être un paramètre spécifique au compilateur. Pour que le dynamic_cast<>, l'opérateur typeid ou les exceptions pour travailler en C++, RTTI doit être activé. Si vous pouvez obtenir le code suivant compilé, alors vous avez déjà activé RTTI (ce que la plupart des compilateurs, y compris g ++, font automatiquement):

#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;
}
1
Vijay Mathew

Dans g ++, vous pouvez tester le __GXX_RTTI macro pour voir si RTTI est activé dans votre code. Comme d'autres l'ont souligné, -no-rtti tourne de RTTI en g ++. Je parierais que ces deux choses fonctionnent aussi en clang.

#ifdef __GXX_RTTI
  w = dynamic_cast<FooBah*>(FooFactory(TYPE, arg));
  if (w != NULL)
  {
    if (w->thing == OK)
      FeastOnOrangUtansAndFruitBatsAndBreakfastCereals();
  }
#endif

Dans le C++ plus récent, nous aurons accès à macros de test de fonctionnalités__cpp_rtti et bien d'autres qui faciliteront ces choses.

0
emsr