c语言void setID(int id) ;生成的的obj文件中?setID@Person@@QAEXH@Z??的含义

在C++中(注意,您提到的函数签名看起来更像是C++的命名修饰规则,而不是纯C的),编译器会对函数名进行修饰(name mangling),以便支持函数重载和命名空间等特性。这种修饰规则因编译器而异,但大多数现代C++编译器(如GCC、Clang和MSVC)都遵循一定的命名规则来确保每个函数名在编译后的二进制文件中是唯一的。

对于您提到的函数名 ?setID@Person@@QAEXH@Z,这是一个由Microsoft Visual C++(MSVC)编译器生成的修饰名。我们可以分解这个名称来理解它的含义:

?:这是MSVC修饰名的开始和结束标志。
setID:这是函数的原始名称。
@Person:这表明该函数是Person类的一部分(即它是Person类的成员函数)。
@@:这是类名和后续修饰符之间的分隔符。
QAEXH:这部分是函数特性的编码,每个字符代表不同的信息:
Q:表示这是一个类成员函数(与全局函数或静态成员函数相对)。
A:表示该函数是公开的(public)。如果它是保护的(protected),则会是B;如果是私有的(private),则会是C。
E:表示这是一个特殊成员函数(如构造函数、析构函数或拷贝构造函数等),但在这里它可能表示一个普通的非静态成员函数(对于MSVC来说,这里的解释可能略有不同,因为通常构造函数会用@@YAEPAX...这样的形式表示)。不过,对于非构造函数/析构函数的普通成员函数,这个字符可能不是很有意义,因为它可能只是填充字符。
X:表示这是一个虚函数(virtual function)。如果函数不是虚的,则这个字符会不同。
H:表示函数的参数类型。在这个上下文中,H通常代表一个int类型的参数(这是MSVC特有的编码方式)。
@Z:这是修饰名的结束标志。
综上所述,?setID@Person@@QAEXH@Z 表示这是一个名为setID的公开虚成员函数,它属于Person类,并且接受一个int类型的参数。

在C语言中,由于不支持函数重载和命名空间,函数名不会被这样修饰。C语言的函数名在编译后的二进制文件中会保持原样(或可能仅受到编译器特定的、简单的修饰,比如添加下划线前缀等)。因此,如果您是在处理C语言代码,并且看到了这样的修饰名,那么很可能您实际上是在处理C++代码,或者您的工具链中某部分错误地将C代码当作C++来处理了。


利用UNDNAME查看?setID@Person@@QAEXH@Z??对应的原函数步骤:
1、打开VC6,File/Open/文件类型(T):所有文件(.)/Open as:Binary/选择对应的obj文件/打开后移到文件的最后
2、在cmd下运行UNDNAME -f ?setID@Person@@QAEXH@Z??

posted @   kksllss  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示