簡體   English   中英

由於 typeid().raw_name(),c++ 代碼不能用 GCC 編譯 - 我該如何解決這個問題?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM