函数名字修饰约定是编译器对函数名字如何处理的规定。
经过编译后,C或者C++函数在内部过程(编译和链接)中通过修饰名识别。修饰名是编译器在编译函数定义或者原型时生成的字符串。编译器用不同的字符串来标识不同的函数。在不同的语言平台下,函数修饰名因编译器的不同而不同(同一语言下也因调用约定的不同而不同)。比如函数声明:int Min(int,int);在C和C++中缺省调用约定都是_cdecl,但两者编译器产生的名字分别是_Min和?Min@@YAHHH@Z。因为C++支持函数重载技术,所以C++的函数修饰名由函数名、类名、调用约定、返回类型、参数等共同决定。这里简单地说明一下C++编译时函数名修饰约定规则(只以_cdecl调用约定为代表):
(1)以“?”标识函数名的开始,后跟函数名。
(2)函数名后面以“@@YA”标识参数表的开始,后跟参数表。
(3)参数表以代号表示:(--为代表的意思,比如:H--int意思是H代表int类型)
X--void ,D--char,E--unsigned char,F--short,H--int,I--unsigned int,J--long,K--unsigned long,M--float,N--double,_N--bool,....,PA--表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以“0”代替,一个“0”代表一次重复。
(4)参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型;指针标识在其所指数据类型前。
(5)参数表后以“@Z”标识整个名字的结束,如果该函数无参数,则以“Z”标识结束。其格式为“?functionname@@YA*****@Z”或“?functionname@@YA*XZ”,例如:(www.xing528.com)
int Min ( int, int ); ——“?Min@@YAHHH@Z”
在前面的例程当中,extern "C" int Min(int, int);这个函数声明前面的extern "C"就是指示C++编译器使用C语言的_cdecl调用约定对Min函数进行函数名字修饰处理的。对比:
两条语句,在C++环境下编译,它们在DLL的导出函数表中的名字分别为Min和?Min@@YAHHH@Z,如图3-4所示。
图3-4 同一函数由于不同修饰词所产生的不一致的内部函数名
如果在开发DLL时,使用后一条语句,那么使用DLL时会给使用者造成很多麻烦。至于有什么样的麻烦,读者会在下一小节中了解到。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。