我的意思是即使它是不可理解的。例如,如果 int 是 32432423423403095590353095309530953,那么它总是相同的。所以我可以很容易地设置一个函数来返回变量是什么类型...
你得到的结果已经实现了。也许它有助于解释您使用的 C++ 实现如何准确地获取您所看到的字符串。
g++ 实现 typeid(...).name() 以便它返回类型的“ABI mangled”名称。这是在编译的目标文件和库中使用的一种表示类型的特殊方式。如果您将 C++ 代码编译成程序集,您将看到“符号”,这些“符号”标识生成的汇编代码与哪些函数或数据相关。例如取函数:
int foo(double a, char b) {
return a + b;
}
compile it to assembly,您会看到类似以下内容:
_Z3foodc:
.LFB0:
.cfi_startproc
movsbl %dil, %edi
cvtsi2sd %edi, %xmm1
addsd %xmm1, %xmm0
cvttsd2si %xmm0, %eax
ret
.cfi_endproc
这里的第一行是用于标识函数int foo(double,char) 的'mangled' 符号。它包含代表函数名称的“Z3foo”,然后是代表第一个参数类型的“d”和代表第二个参数类型的“c”。该符号用于标识二进制对象文件中的函数、库索引中的函数、想要链接到该函数的其他编译对象等。
您也可以使用 c++filt 工具demangle symbols。该工具会扫描您传递给它的任何文本,以寻找符合修饰语法的内容,并将它们转换为更像这些类型在 C++ 源代码中的命名方式。
g++ 实现了Itanium C++ ABI 修改方案。大多数 unix 平台编译器都使用它。
那么,回到你的代码,猜猜这些符号中“int”类型是如何表示的。
Itanium ABI specifies 一个额外的去杂化功能。 Here's 一个使用它的例子。