一. C 函数的修饰形式取决于其声明中使用的调用约定,如下所示。
调用约定 修饰
__cdecl(默认值)
前导下划线 (_)
__stdcall
前导下划线 (_) 和结尾 at 符 (@),后面跟表示参数列表中的字节数的数字
__fastcall
与 __stdcall 相同,但前置符不是下划线,而是 @ 符
二. C++ 函数的修饰名包含下列信息:
函数名。
函数所属的类(如果函数是成员函数)。这可能包括封装函数的类的类,等等。
函数所属的命名空间(如果函数是某个命名空间的组成部分)。
函数的参数类型。
调用约定。
函数的返回类型。
例子:
未修饰名 修饰名
int a(char){int i=3;return i;};
void __stdcall b::c(float){};
三. 由上可见由于修饰名的不同会带来链接问题,即当我们用C语言做了个动态/静态库的时候
若要在C++主程序中调用它们, 必须要通知C++禁用它的修饰方式,采用C方式
比如:若我们在C定义的dll/lib中的函数如下
void FreeObjs();
那么我们在C++要用它们的时候必须声明如下:
extern “C” void FreeObjs();
这们就禁用了C++的函数名修饰方式了, 这样才会链接成功, 否则会发生找不到该函数链接失败的错误
,这是因为C写的库中该函数名为 _FreeObjs 而C++中就为
显然两个名字都不同,当然链接会失败
Leave a Reply