由于typeid().raw_name() ,Visual C++代码无法使用GCC编译 - 我该如何解决这个问题?

visual c++ code won't compile with GCC because of typeid().raw_name() - how can I fix this?

本文关键字:何解决 编译 解决 问题 GCC name raw typeid Visual C++ 由于      更新时间:2023-10-16

以下代码在带有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能解决问题吗?

写这些:

// 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 中包含重整/拆解。你可以在这里看到一个示例。

#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);