gcc程序获取对象类型名
程序员文章站
2022-05-29 11:49:37
...
gcc调试时用typeid(typename).name()查看对象的类型名称,输出的是经过修饰的名字.
如下面的代码,每种类型输出的名字对应每行右边的注释内容.
#include<iostream>
struct stA {
};
using namespace std;
cout<<typeid(int)<<endl; ///< "i"
cout<<typeid(std::string).name()<<endl; // "Ss"
cout<<typeid(stA).name()<<endl; ///< "3stA"
cout<<typeid(const char*).name();<<endl; /// "PKc"
具体是什么类型,可以通过(1)工具,如c++filt (2)程序方式查看
-
c++filt
$ c++filt i -t
int
$ c++filt Ss -t
std::basic_string<char, std::char_traits<char>, std::allocator<char> >
$ c++filt 3stA -t
stA
$ c++filt PKc -t
char const*
-
程序方式
代码来自:http://www.cplusplus.com/forum/beginner/175177/
std::string demangle( const char* mangled_name ) {
std::size_t len = 0 ;
int status = 0 ;
std::unique_ptr< char, decltype(&std::free) > ptr(
__cxxabiv1::__cxa_demangle( mangled_name, nullptr, &len, &status ), &std::free ) ;
return ptr.get() ;
}
使用:
cout<<demangle(typeid(const char*).name());<<endl; ///< "char const*"
demangle的非smart_ptr版本代码:
#ifdef __GNUG__ // gnu C++ compiler
#include <cxxabi.h>
#include <stdlib.h>
std::string demangle( const char* mangled_name ) {
std::string result ;
std::size_t len = 0 ;
int status = 0 ;
char* ptr = __cxxabiv1::__cxa_demangle( mangled_name, nullptr, &len, &status ) ;
if( status == 0 ) result = ptr ; // hope that this won't throw
else result = "demangle error" ;
::free(ptr) ;
return result ;
}
#else
std::string demangle( const char* name ) { return name ; }
#endif // _GNUG_
码如下:
推荐阅读
-
js获取对象属性的值(讲解js遍历对象属性名获取属性值)
-
js获取类名的3种方法(教你js对象删除某个元素)
-
jquery获取对象的方法足以应付常见的各种类型的对象
-
【转载】C#使用typeof运算符获取对象变量的具体类型Type
-
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
-
5位评委对参赛选手进行打分,将所有的打分结果存储到对应类型的数组中, 将所有的评分结果去除一个最低分,去除一个最高分,然后获取的平均分数为 选手的最终得分.设计程序,用键盘输入5位评委的评分,并打印输
-
gcc -finstrument-functions 追踪函数调用,获取程序的执行流程
-
微信小程序获取网络类型的方法示例 原创
-
PackageManager应用名(程序名)获取应用包名
-
Java获取Mysql表结构和获取ResultSet对象中列的类型和属性信息的方法