Comment désactiver RTTI dans Visual Studio 2008

Je ne suis pas sûr des autres versions, mais dans VS 2008, même avec RTTI désactivé, je peux interroger les informations en appelant typeid(T).name() sur le type. Cela fonctionne avec tous les types, internes et créés par l’utilisateur.

Notre projet a désactivé RTTI mais j’ai été surpris de constater que cela fonctionnait toujours. S’agit-il d’un bogue Visual Studio ou l’indicateur /GR- n’est-il pas suffisant pour le désactiver? Est-ce que cela tombe dans le domaine des undefined behavior ? Si ce n’est pas un bug, comment puis-je vraiment le désactiver?

Est-il possible que vous ayez utilisé typeid sur une expression dont le type est connu au moment de la compilation? Dans ce cas, vous évitiez complètement l’aspect “exécution” de RTTI. Dans la documentation Microsoft sur typeid :

Si l’expression n’est ni un pointeur ni une référence à une classe de base de l’object, le résultat est une référence type_info représentant le type statique de l’expression. Le type statique d’une expression fait référence au type d’une expression telle qu’elle est connue au moment de la compilation. La sémantique d’exécution est ignorée lors de l’évaluation du type statique d’une expression.

Tout d’abord, l’utilisation de typeid (ou dynamic_cast ) lorsque RTTI est désactivé va certainement conduire à un comportement indéfini. Mon conseil serait de ne pas faire ça.

Dans tous les cas, je ne pense pas que vous deviez faire autre chose que /GR- pour désactiver RTTI dans le compilateur de Microsoft. C’est peut-être un bug qu’il ne donne pas d’avertissement ou d’erreur en le faisant. Cela donne un avertissement pour dynamic_cast :

 1>d:\src\MyClass.cpp (82) : warning C4541: 'dynamic_cast' used on polymorphic type 'MyClass' with /GR-; unpredictable behavior may result 

Cependant, il ne donne aucun avertissement de ce typeid pour typeid . Cela n’a pas changé non plus dans le compilateur VS2010.

Note secondaire: gcc donne une erreur de compilation si vous essayez d’utiliser typeid avec -fno-rtti , contrairement à clang (même avec -Wall ).