Может кто-либо говорить мне, как активировать RTTI в C++ при работе над Unix. Я слышал, что это может быть отключено и включено. на моей среде Unix, как я мог проверить, включен ли RTTI или отключен?
Я использую aCC
компилятор на HPUX.
Вы используете g++
или другой компилятор?
В g++
RTTI включен по умолчанию IIRC, и вы можете отключить его с помощью -fno-rtti
. Чтобы проверить, активен он или нет, используйте dynamic_cast
или typeid
Я полагаю, что в HPUX aCC
/aC++
RTTI также включен по умолчанию, и мне неизвестно, как его отключить. Проверьте ваши man
страницы.
RTTI будет включен или отключен при компиляции вашей программы с помощью параметров компилятора - это не что-то включено или отключено в среде Unix во всем мире. Самый простой способ узнать, включен ли он по умолчанию для вашего компилятора, - это просто попробовать скомпилировать какой-то код с использованием RTTI.
Параметры включения / отключения RTTI будут зависеть от компилятора - какой компилятор вы используете?
Поддержка RTTI включена по умолчанию в GCC, параметр -fno-rtti
отключает поддержку (в случае вы используете GCC и, возможно, кто-то отключил RTTI в файле makefile или что-то в этом роде).
Согласно документации нет возможности отключить его. Единственные два бита стандартного C ++, которые могут быть выборочно отключены, - это «область переменных в циклах for» ( -Wc, ansi_for_scope, off
) и поиск имен, зависящий от аргумента ( -Wc, - koenig_lookup, офф
). Нет опции, аналогичной -Wc, -RTTI, off
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
Включение и отключение 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;
}
Во всех известных мне современных компиляторах C ++ (GCC, Intel, MSVC, SunStudio, aCC) RTTI включен по умолчанию, поэтому, если у вас нет никаких подозрений, что он может быть отключен по какой-либо причине, вы можете смело предположить что RTTI в on.