C++中typeid.name()输出的"PKc"具体含义是什么?
为什么
typeid(typeid(check).name()).name()总是返回PKc? 让我把这个问题拆解清楚——你困惑的PKc其实是主流编译器对特定类型的名称编码,核心原因和typeid的返回值类型直接相关:
1. 先明确typeid(T).name()的返回值类型
在C++里,typeid运算符会返回一个const std::type_info&对象,而它的name()成员函数返回的是**const char*类型的指针**——也就是指向C风格字符串的常量指针,不管你传入的原变量是char、double还是其他类型,这个返回值类型永远不变。
2. 拆解PKc的具体含义
主流编译器(比如GCC、Clang)遵循Itanium C++ ABI的类型编码规则,PKc的每个字符对应如下含义:
P:代表指针(Pointer)K:代表常量(const)c:代表char基础类型
把这些组合起来读,PKc就是const char*的编码结果——这正好是typeid(check).name()的返回值类型,所以不管原变量是什么类型,第二次typeid检测的都是这个指针类型,结果自然永远是PKc。
结合你的代码验证
咱们看你第一个代码示例:
#include<bits/stdc++.h> using namespace std; int main() { char check='e'; cout<<typeid(check).name()<<"\n"; // 输出'c',对应char类型 cout<<typeid(typeid(check).name()).name(); // 传入的是const char*,输出PKc }
第二个代码逻辑完全一致:
#include<bits/stdc++.h> using namespace std; int main() { double check=69.666; cout<<typeid(check).name()<<"\n"; // 输出'd',对应double类型 cout<<typeid(typeid(check).name()).name(); // 传入的还是const char*,输出PKc }
小补充:类似编码的解码规律
如果以后遇到其他类型编码,记住从右往左读的规则:前缀修饰后面的类型。比如Pi就是int*,PKd就是const double*,以此类推。
内容的提问来源于stack exchange,提问作者pkdyn
相关产品推荐
相关产品推荐

