Как отключить RTTI в Visual Studio 2008 - PullRequest
3 голосов
/ 29 июля 2011

Я не уверен насчет других версий, но в VS 2008 даже с отключенным RTTI я могу запросить информацию, вызвав typeid(T).name() для данного типа.Он работает со всеми типами, внутренними и созданными пользователем.

В нашем проекте отключен RTTI, но я с удивлением обнаружил, что это все еще работает.Это ошибка Visual Studio или флага /GR- недостаточно для его отключения?Это относится к сфере undefined behavior?Если это не ошибка, как я могу отключить его?

Ответы [ 2 ]

6 голосов
/ 29 июля 2011

Возможно ли, что вы использовали typeid в выражении, тип которого известен во время компиляции?Если это так, то вы полностью обойдете аспект RTTI во время выполнения.Из документации Microsoft по typeid:

Если выражение не является ни указателем, ни ссылкой на базовый класс объекта, результатом является ссылка type_info, представляющая статический тип выражения.Статический тип выражения относится к типу выражения, известному во время компиляции.Семантика выполнения игнорируется при оценке статического типа выражения.

2 голосов
/ 29 июля 2011

Прежде всего, использование typeid (или dynamic_cast), когда RTTI отключен, определенно приведет к неопределенному поведению. Мой совет - не делать этого.

В любом случае, я не верю, что вам нужно что-то делать, кроме /GR-, чтобы отключить RTTI в компиляторе Microsoft. Возможно, это ошибка, которая не выдает предупреждение или ошибку при этом. Выдает предупреждение за dynamic_cast:

1>d:\src\MyClass.cpp (82) : warning C4541: 'dynamic_cast' used on polymorphic type 'MyClass' with /GR-; unpredictable behavior may result

Однако, это не дает такого предупреждения для typeid. Это не изменилось и в компиляторе VS2010.

Примечание: gcc выдает ошибку компиляции, если вы пытаетесь использовать typeid с -fno-rtti, а clang - нет (даже с -Wall).

...