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.
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
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 .
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
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
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é.
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).
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;
}
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.