1

以下代码在 Windows 上使用 Visual Studio 编译良好:

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是微软特定的实现。我必须如何更改我的代码才能在 Windows 和 Linux 系统上编译?

EDIT1我宁愿不修改原始代码,我只需要一个解决方法来用 gcc 编译。那可能吗?

EDIT2会成功#define raw_name name吗?

4

3 回答 3

0

写下这些:

// for variables:
template<typename T>
char const* GetRawName( T unused ) { ... }
// for types:
template<typename T>
char const* GetRawName() { ... }

在 Windows 和非 Windows 上使用不同的实现,使用#ifdef您知道在 microsoft 编译器中定义的令牌上的块,但在您的其他编译器中没有。这将 MS 和非 MS 编译版本之间的预处理差异隔离到一个隔离文件中。

这确实需要对原始代码进行少量更改,但这样做的方式仍然可以在 microsoft 编译器上编译。

于 2012-11-27T15:28:53.603 回答
0

这样做可能更安全#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名称在词法上与关键字 [...] 相同),但它很有可能起作用,并且在其他地方需要最少的修改。

于 2012-11-27T15:28:56.950 回答
0

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);
于 2020-12-17T02:44:49.233 回答