extern "c" 动态链接库符号表导出问题 以及函数参数压栈顺序

本文讨论了C++动态链接库在不同编译器下导出符号的问题,强调了extern "C"在解决名称混淆中的作用。同时,介绍了C语言中函数参数的压栈顺序和责任分配,以及Windows特有的stdcall调用约定,指出__cdecl和__stdcall宏用于指定参数管理方式。
摘要由CSDN通过智能技术生成

c语言编译的动态链接库中,导出的符号名字就是 源代码中的相应的名字;

例如函数 void test(){} 导出的符号名字 就是 test


但是对于c++ 来讲不是这样, c++ 有类, 名字空间, 函数重载, 导致多个不同的对象可能使用一个相同的名字, 这样必须由编译器来生成全局的唯一名字;

这种生成的方式 没有标准化, 所以 window上的vc 编译器可能生成一种名字, linux上的gcc 可能生成一种名字, mingw 可能也会生成一种名字;

因此不同编译器生成的C++动态库, 从符号名字上来讲,不兼容。


但是如果需要从C++库导出某些名字 使得大家都认识该怎么做呢?

源代码中写下:

extern "c"{

   void test();

}

将会生成 标准的c符号名字, 也就是 test, 这样所有人都会认识这个符号了!

当然要注意一点 所有声明该符号的位置 不能出现在名字空间中, 否则 仍旧生成 C++类型的符号名字。



标准c中定义了函数的参数的压栈和出栈相关问题: 压栈从右向左压入参数;而当函数返回的时候, 由调用者负责清理堆栈, 弹出 相应的参数

也就是被调用者 直接return, 调用者再清理 堆栈顶部指针, 这样实现printf 函数就比较方便了(可变长度参数࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值