Boost中Core模組的demangle用法及說明
阿新 • • 發佈:2018-11-24
標頭檔案
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; }
執行結果
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; }
執行結果
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; }
執行結果
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;
}
執行結果
原始碼
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