[英]c++ code won't compile with GCC because of typeid().raw_name() - how can I fix this?
下面的代碼在帶有 Visual Studio 的 Windows 上編譯得很好:
class_handle(base *ptr) : ptr_m(ptr), name_m(typeid(base).raw_name()) { signature_m = CLASS_HANDLE_SIGNATURE; }
如果我嘗試在 Linux 上編譯相同的代碼,我會得到:
error: ‘const class std::type_info’ has no member named ‘raw_name’
據我了解, raw_name
是 Microsoft 特定的實現。 我必須如何更改我的代碼才能在 Windows 和 Linux 系統上編譯?
EDIT1我不想修改原始代碼,我只需要一個解決方法來編譯 gcc。 那可能嗎?
EDIT2 #define raw_name name
會#define raw_name name
嗎?
寫這些:
// for variables:
template<typename T>
char const* GetRawName( T unused ) { ... }
// for types:
template<typename T>
char const* GetRawName() { ... }
在 Windows 和非 Windows 上使用不同的實現,在您知道在 microsoft 編譯器中定義的令牌上使用#ifdef
塊,但不在您的其他編譯器中。 這將 MS 和非 MS 編譯版本之間的預處理差異隔離到一個隔離文件中。
這確實需要對原始代碼進行最少的更改,但這樣做的方式仍然可以在 microsoft 編譯器上編譯。
#define typeid
可能更安全:
class compat_typeinfo {
const std::type_info &ti;
public:
explicit compat_typeinfo(const std::type_info &ti): ti(ti) {}
const char *name() const { return ti.name(); }
const char *raw_name() const { return ti.name(); }
};
compat_typeinfo compat_typeid(const std::type_info &ti) {
return compat_typeinfo(ti);
}
#define typeid(x) compat_typeid(typeid(x))
當然,這在 17.6.4.3.1p2 中是非法的(翻譯單元不應#define
或#undef
名稱與關鍵字 [...] 在詞法上相同),但它很有可能工作,並且需要在其他地方進行最少的修改。
GCC 沒有定義raw_name
但在cxxabi.h
中包含 mangling/ cxxabi.h
。 您可以在此處查看示例。
#include <cxxabi.h>
//...
std::bad_exception e;
realname = abi::__cxa_demangle(e.what(), 0, 0, &status);
std::cout << e.what() << "\t=> " << realname << "\t: " << status << '\n';
free(realname);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.