由于typeid().raw_name() ,Visual C++代码无法使用GCC编译 - 我该如何解决这个问题?
visual 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
能解决问题吗?
写这些:
// 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);
相关文章:
- 从macOS Catalina上的源代码编译LLVM(如何解决未找到"stdio.h")
- 我正在尝试制作一个自平衡机器人,但编译时存在错误。我不知道如何解决它
- 在Linux/Ubuntu中编译openCV应用程序时,如何解决未定义的引用cv:..?
- 如何解决我在 Ubuntu 19.04 下使用 GLFW 时遇到的这个编译问题?
- 解决由于在哈希函数中使用了不完整的类型而导致的编译失败
- 正在尝试解决特定于gcc的编译错误
- 为什么包含任意 STL 标头可以解决这些编译错误?
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- C++编译错误LNK2019:未解决的外部符号错误
- 如何解决RUN_ERROR即使它正常编译
- 当 pkg-config 不能解决 opencv 'undefined reference'编译问题时,如何解决它?
- 编译示例 Cinder 项目时存在大量未解决的外部问题
- 解决此C 代码的编译错误
- 使用/解决模板时停止编译
- 编译轨道样品时的C 错误-LNK2019未解决的外部符号
- 尝试解决"out of scope"编译错误:CodeBlocks,Linux Fedora
- 窄转换编译警告.如何解决它
- 格式化如何解决操作数编译错误关于c++操作数ATR的
- 在CentOS 7 x64上编译QT时,如何解决矛盾的库问题
- 如何使用"python setup.py build"解决C++/C编译过程中的"conflicting types"错误?