активируйте RTTI в C++

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

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

33
задан j0k 22 May 2013 в 07:19
поделиться

6 ответов

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

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

UPDATE

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

24
ответ дан 27 November 2019 в 18:13
поделиться

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

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

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

2
ответ дан 27 November 2019 в 18:13
поделиться

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

8
ответ дан 27 November 2019 в 18:13
поделиться

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
20
ответ дан 27 November 2019 в 18:13
поделиться

Включение и отключение 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;
}
1
ответ дан 27 November 2019 в 18:13
поделиться

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

6
ответ дан 27 November 2019 в 18:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: