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