Boost中Core模块的demangle用法及说明

头文件

boost/core/demangle.hpp

作用

我们都知道,C++中,编译变量,类,及全局函数,编译后的名称,已经发生了改变,我们称之为 添加修饰。那么,我们有什么方法将这种修饰,擦除掉呢?,demangle能够帮助我们完成这一项功能。

举例

boost::core::demangled_name

#include <boost/core/typeinfo.hpp>
#include <iostream>

template<class T1, class T2> struct Y1
{
};

int main()
{
    typedef Y1<int, long> T;
    std::cout << boost::core::demangled_name( BOOST_CORE_TYPEID( T ) );

	char ch;
	std::cin>>ch;

    return 0;
}

运行结果

demangled_name

boost::core::demangle

#include <boost/core/demangle.hpp>
#include <typeinfo>
#include <iostream>

template<class T1, class T2> struct Y1
{
};

void test_demangle()
{
    typedef Y1<int, long> T;
    std::cout << boost::core::demangle( typeid( T ).name() ) << std::endl;
}

int main()
{
    test_demangle();
    char ch;
    std::cin>>ch;

    return 0;
}

运行结果

test_demangle运行结果

boost::core::demangle_alloc及boost::core::demangle_free

#include <boost/core/demangle.hpp>
#include <typeinfo>
#include <iostream>

template<class T1, class T2> struct Y1
{
};

void test_demangle_alloc()
{
    typedef Y1<int, long> T;
    const char* p = boost::core::demangle_alloc( typeid( T ).name() );
    if (p)
    {
        std::cout << p << std::endl;
        boost::core::demangle_free(p);
    }
    else
    {
        std::cout << "[demangling failed]" << std::endl;
    }
}

int main()
{
    test_demangle_alloc();
    
    char ch;
    std::cin>>ch;

    return 0;
}

运行结果

test_demangle_alloc运行结果

boost::core::scoped_demangled_name demangled_name

#include <boost/core/demangle.hpp>
#include <typeinfo>
#include <iostream>

template<class T1, class T2> struct Y1
{
};

void test_scoped_demangled_name()
{
    typedef Y1<int, long> T;
    boost::core::scoped_demangled_name demangled_name( typeid( T ).name() );
    const char* p = demangled_name.get();
    if (p)
    {
        std::cout << p << std::endl;
    }
    else
    {
        std::cout << "[demangling failed]" << std::endl;
    }
}

int main()
{
    test_scoped_demangled_name();

    char ch;
    std::cin>>ch;

    return 0;
}

运行结果

test_scoped_demangled_name运行结果

源码

namespace boost
{

namespace core
{

inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT;
inline void demangle_free( char const * name ) BOOST_NOEXCEPT;

class scoped_demangled_name
{
private:
    char const * m_p;

public:
    explicit scoped_demangled_name( char const * name ) BOOST_NOEXCEPT :
        m_p( demangle_alloc( name ) )
    {
    }

    ~scoped_demangled_name() BOOST_NOEXCEPT
    {
        demangle_free( m_p );
    }

    char const * get() const BOOST_NOEXCEPT
    {
        return m_p;
    }

    BOOST_DELETED_FUNCTION(scoped_demangled_name( scoped_demangled_name const& ))
    BOOST_DELETED_FUNCTION(scoped_demangled_name& operator= ( scoped_demangled_name const& ))
};


#if defined( BOOST_CORE_HAS_CXXABI_H )

inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT
{
    int status = 0;
    std::size_t size = 0;
    return abi::__cxa_demangle( name, NULL, &size, &status );
}

inline void demangle_free( char const * name ) BOOST_NOEXCEPT
{
    std::free( const_cast< char* >( name ) );
}

inline std::string demangle( char const * name )
{
    scoped_demangled_name demangled_name( name );
    char const * p = demangled_name.get();
    if( !p )
        p = name;
    return p;
}

#else

inline char const * demangle_alloc( char const * name ) BOOST_NOEXCEPT
{
    return name;
}

inline void demangle_free( char const * ) BOOST_NOEXCEPT
{
}

inline std::string demangle( char const * name )
{
    return name;
}

#endif

} // namespace core

} // namespace boost

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值