Có cách nào để lấy thông tin typeid
biên dịch từ GCC với RTTI bị vô hiệu hóa không? Trong Visual Studio, một lệnh đơn giản như const char* typeName = typeid(int).name();
sẽ trả về "int" một cách thích hợp, ngay cả khi RTTI bị tắt. Thật không may, GCC không thể làm như vậy. Khi tôi cố gắng gọi typeid
mà không cần RTTI, chương trình của tôi bị treo. Tôi biết vô hiệu hóa RTTI không phải là một phần của tiêu chuẩn, nhưng có anyway tôi có thể buộc GCC để làm biên dịch thời gian giải quyết các loại được biết đến?Loại thời gian biên dịch không có RTTI với GCC
RTTI bị tắt vì lý do hiệu suất. Tôi không cần RTTI thời gian chạy.
Edit:
Đây là những gì tôi đã kết thúc đi với:
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; }
Nó đòi hỏi rằng REFLECTION_REGISTER_TYPE
được gọi cho tất cả các loại cần thông tin phản ánh. Nhưng miễn là nó được gọi cho mọi loại yêu cầu, gọi TypeName<int>
hoạt động hoàn hảo. Tôi cũng đã thêm hàm TypeName(T type)
có nghĩa là bạn có thể làm những việc như sau: int x = 0; printf(TypeName(x));
và nó sẽ in ra "int". GCC thực sự có thể làm điều này tại thời gian biên dịch như VC++ có thể.
lý do hiệu suất là gì bạn quan tâm? RTTI cơ bản là miễn phí, tiết kiệm một số chi phí kích thước nhị phân. –
@Kyle: Trong g ++ với RTTI được bật, 'typeid (int) .name()' sẽ trả về "i" not "int". Điều đó có liên quan không? –
@R. Martinho Fernandes: GCC có một số funcitons demangling có thể biến "i" thành "int". – Kyle