extern “C“

17 篇文章 0 订阅
#ifdef _cplusplus
{extern "C"
#enif

void foo(int,int);

#ifdef _cplusplus
}
#enif

先说说函数签名:
1.在C++中,函数是可重载的,而C是不可重载的,故两者生成函数签名的原则是不同的。c++生成的函数签名可能是_foo_int_int,而C生成的函数签名可能是_foo;
2.编译源文件生成目标文件时,目标文件的内容就是每个函数签名及其位置(符号表);
3.若不带extern “C”,则按c++的规则生成函数签名,当链接c的目标文件时(c的目标文件是用c编译器编译的),在其目标文件找不到相应的签名,从而导致“未找到符号”的错误。
带extern "C"后,则按c的规则生成函数签名,此时连接c的目标文件就能找到对应的签名,链接成功。

c的目标文件:
在这里插入图片描述
c++引用c函数生成的目标文件(不带extern “C”):
在这里插入图片描述
c++引用c函数生成的目标文件(带extern “C”):
在这里插入图片描述
参考:
https://www.cnblogs.com/xiangtingshen/p/10980055.html
https://www.cnblogs.com/TenosDoIt/p/3163621.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值