rtti в g++

stm8823636

как програмно определить с rtti компиляция или без?
GCC 3.4

procenkotanya

man gcc
/rtti
у меня на 4.0.2
-fno-rtti
Disable generation of information about every class with virtual functions for use by the C++ runtime type identification features
(dynamic_cast and typeid). If you don't use those parts of the language, you can save some space by using this flag. Note that exception handling uses the same information, but it will generate it as needed.

стало быть, по умолчанию включена, -fno-rtti выключает

stm8823636

Можно было прочитать вопрос. В MSVC есть макрос _CPPRTTI, который определен если RTTI включен. Есть ли что нибудь подобное в GCC?

procenkotanya

Упс, прошу прощения. Было бы лучше, если бы ты сразу про _CPPRTTI написал
Насколько я понял, аналогичного препроцессорного макро у них нет (искал в гугле и в исходниках GCC)
Можешь рассказать, зачем такая фича понадобилась?

stm8823636

Необходимо реализовать код компилируемый на msvc и gcc. В msvc код реализован. Макрос _CPPRTTI нужен даля развилок кода по вариантам сборки. Нужно доделать в gcc. Как мне показалось GCC выдает ОДИНАКОВЫЙ обьектник в обоих случах и с -fno-rtti и без. так что проблема вроде решилась.

Landstreicher

> Макрос _CPPRTTI нужен даля развилок кода по вариантам сборки
Обычно, если в задаче используется RTTI, то без RTTI ее нормально не решить, т.е. он необходим.
Можешь привести пример, что за задача, что решается и с RTTI, и без.

stm8823636

В отладочных целях исключение может вернуть имя вызывающего класса. В дебажной сборке это есть, в финале быть не должно.

shlyumper

Может тогда правильнее это назвать #ifdef DEBUG_BUILD, а не #ifdef _CPPRTTI?

stm8823636

В любой сборке может быть выключен RTTI

Landstreicher

В g++ для этого можно вызвать typeid(x).name (кажется так). Если включен RTTI, то это вернет имя класса. Если не включен --- то пустую строку. Никаких #ifdef RTTI не надо.

stm8823636

ключик -fno-rtti не дает компилировать код типа typeid лала в gcc 3.4.

stm8823636

А вот за это спасибо! Я плохо смотрел!
Оставить комментарий
Имя или ник:
Комментарий: