активировать RTTI в C ++ - PullRequest
       64

активировать RTTI в C ++

33 голосов
/ 14 апреля 2010

Может кто-нибудь сказать мне, как активировать RTTI в C ++ при работе на Unix. Я слышал, что это можно отключить и включить. в моей среде Unix, как я могу проверить, включен ли RTTI или нет?

Я использую компилятор aCC в HPUX.

Ответы [ 7 ]

23 голосов
/ 14 апреля 2010

Вы используете g++ или какой-то другой компилятор?

В g++ RTTI включен по умолчанию IIRC, и вы можете отключить его с помощью -fno-rtti. Чтобы проверить, активен он или нет, используйте dynamic_cast или typeid

UPDATE

Я считаю, что у HPUX aCC / aC++ также по умолчанию включен RTTI, и я не знаю, как его отключить. Проверьте ваши man страницы .

20 голосов
/ 14 апреля 2010

gcc имеет его по умолчанию. Проверьте, дает ли typeid (foo) .name () что-то полезное.

#include <iostream>
#include <typeinfo>

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

Без RTTI вы получите что-то вроде:

foo.cpp:6: error: cannot use typeid with -fno-rtti
8 голосов
/ 14 апреля 2010

Согласно документам нет возможности отключить его. Только два бита стандарта C ++, которые можно выборочно отключить, это «область видимости переменных в циклах for» (-Wc,ansi_for_scope,off) и зависимый от аргумента поиск имен (-Wc,-koenig_lookup,off). Там нет опции, похожей на -Wc,-RTTI,off

6 голосов
/ 14 апреля 2010

На всех известных мне современных компиляторах C ++ (GCC, Intel, MSVC, SunStudio, aCC) RTTI включен по умолчанию, поэтому, если у вас нет подозрений, что он может быть отключен по какой-то причине, вы можете смело предполагать, что RTTI включен.

2 голосов
/ 14 апреля 2010

RTTI будет включен или отключен при компиляции вашей программы с помощью параметров компилятора - это не что-то включенное или отключенное в среде Unix во всем мире. Самый простой способ проверить, включен ли он по умолчанию для вашего компилятора, - просто попытаться скомпилировать некоторый код с использованием RTTI.

Опции для включения / отключения RTTI будут зависеть от компилятора - какой компилятор вы используете?

Поддержка RTTI по ​​умолчанию включена в GCC, опция -fno-rtti отключает поддержку (если вы используете GCC и, возможно, кто-то выключил RTTI в make-файле или что-то в этом роде).

1 голос
/ 14 апреля 2010

Включение и отключение RTTI должны быть специфическими для компилятора. Чтобы операция dynamic_cast<>, оператор или исключения typeid работали в C ++, RTTI должен быть включен. Если вы можете скомпилировать следующий код, то у вас уже включен RTTI (что большинство компиляторов, включая g ++, делают автоматически):

#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;
}
0 голосов
/ 08 октября 2014

В g ++ вы можете проверить макрос __GXX_RTTI , чтобы увидеть, включен ли RTTI в вашем коде.Как уже указывали другие -no-rtti повороты RTTI в g ++.Могу поспорить, что обе эти вещи работают и в clang.

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

В более новом C ++ у нас будет доступ к макросам тестирования функций __cpp_rtti и многим другим, которые облегчат эти вещи..

...