typeid奇怪的输出

研究typeid奇怪的输出

最近写程序使用到typeid,其输出在类型名前缀了一些数字或字母,对此不清楚,于是一探究竟。使用query c++ typeid output prefix 8 google后发现,typeid的输出是实现定义的,g++的输出是经过修饰的,为了去掉修饰,我们可以使用c++filt__cxa_demangle

以上答案请参见how-to-print-demangled-name,在此作一记录。

下面给出一个具体的例子:

#include 
#include 

struct empty {};

template <typename T, int N>
struct bar {};

int main() {
    int status;
    char* realname;

    // typeid
    bar17> u;
    const std::type_info& ti = typeid(u);

    realname = abi::__cxa_demangle(ti.name(), 0, 0, &status);
    std::cout << ti.name() << "\t=> " << realname << "\t: " << status << '\n';
    free(realname);

    return 0;
}

上述代码片段的输出为:

3barI5emptyLi17EE   => bar<empty, 17>   : 0

可以看到,如果不进行demangle,我们得到的输出就是3barI5emptyLi17EE,这样的输出是经过装饰的,而我们希望输出跟源代码中一致的类型。

你可能感兴趣的:(typeid奇怪的输出)