Подтвердить что ты не робот

Активировать RTTI в С++

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

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

4b9b3361

Ответ 1

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

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

UPDATE

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

Ответ 2

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

Ответ 3

В соответствии с документами нет возможности отключить его. Единственными двумя битами стандартного С++, которые могут быть выборочно отключены, являются "область переменных для циклов" (-Wc,ansi_for_scope,off) и зависимый от аргументов поиск имен (-Wc,-koenig_lookup,off). Нет опции, аналогичной -Wc,-RTTI,off

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

Включение и отключение RTTI должно быть специфичным для компилятора. Для работы dynamic_cast<> оператор typeid или исключения для работы на С++, 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;
}

Ответ 7

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

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

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