Czy mimo to można uzyskać informację o kompilacji typeid
z GCC z wyłączonym RTTI? Pod Visual Studio, proste polecenie, takie jak const char* typeName = typeid(int).name();
odpowiednio zwróci "int", nawet jeśli RTTI jest wyłączone. Niestety GCC nie może zrobić tego samego. Kiedy próbuję wywołać typeid
bez RTTI, mój program ulega awarii. Wiem, że wyłączenie RTTI nie jest częścią standardu, ale czy mimo to mogę wymusić GCC, aby wykonał kompilację czasową znanych typów?Czas kompilacji typeid bez RTTI z GCC
Usługa RTTI jest wyłączona ze względu na wydajność. Nie potrzebuję RTTI środowiska wykonawczego.
Edit:
Oto co się dzieje z zakończonych:
template<typename T> const char* TypeName(void);
template<typename T> const char* TypeName(T type) { return TypeName<T>(); }
#define REFLECTION_REGISTER_TYPE(type) \
template <> const char* TypeName<type>(void) { return #type; }
Wymaga ona REFLECTION_REGISTER_TYPE
nazwać dla każdego typu, który potrzebuje informacji refleksji. Ale tak długo, jak jest to wymagane dla każdego wymaganego typu, wywołanie TypeName<int>
działa idealnie. Dodałem także funkcję TypeName(T type)
, co oznacza, że możesz wykonać następujące czynności: int x = 0; printf(TypeName(x));
i wydrukuje "int". GCC powinien naprawdę być w stanie to zrobić w czasie kompilacji, tak jak VC++.
powody Co wydajność Czy jesteś zaniepokojony? RTTI jest w zasadzie bezpłatny, oszczędzając na binarnym obciążeniu. –
@Kyle: W g ++ z włączonym RTTI, 'typeid (int) .name()' zwróci "i" nie "int". Czy to jest istotne? –
@R. Martinho Fernandes: GCC ma kilka funkcji demangowania, które mogą zmienić "i" w "int". – Kyle