C++调用C函数实例详解

前言:以前见到extern "C"这样的语句,只是简单地知道跟外部链接有关,但是没有深刻理解它的意思。
首先,为什么要使用extern "C"修饰符?
C++调用其它语言的函数,由于编译器生成函数的机制不一样,所以需要经过特殊处理,才可以调用。调用C语言的函数,需要在函数声明的地方语句extern "C"。如果不使用该语句,在链接的时候,编译器就会报以下这种错误。
Test.obj : error LNK2019: 无法解析的外部符号 "void __cdecl DeleteStack(struct _Node *)" (?DeleteStack@@YAXPAU_Node@@@Z),该符号在函数 _main 中被引用。
然后是如何使用?
应该怎么使用该语句呢?
刚开始,我简单地在C++源文件的前面使用该语句声明,但是还是出错,而且是在编译阶段就报错。
error C2732: 链接规范与“DeleteStack”的早期规范冲突。
为什么会出现这个错误呢?因为C++源文件已经引入了C的头文件,在头文件里,声明该函数时没有extern修饰,而这里有extern修饰,所以冲突了。解决的办法有两个。
一。在C头文件中加上extern修饰符。
直接加,也不行。因为C源文件也包含了这个头文件,当编译C源文件时,就会出现错误。所以,需要一种机制来区分是编译C还是C++文件。方法如下:
#ifdef __cplusplus extern "C" #endif void DeleteStack(Stack stack);
因为在编译C++文件时,自动定义预处理器名字__cplusplus,而编译C时,没有该处理器名字。所以只有编译C++时,才有符号extern “C”。
此外,链接指示extern "C"有单个和复合两种形式。以上为单个形式,复合形式可以同时将几个函数声明为extern "C"
extern "C" {
void DeleteStack(Stack stack);
void PrintStack(Stack stack);
void Pop(Stack stack);
}
加上预处理器名字如下:
#ifdef __cplusplus
extern "C" {
#endif
void DeleteStack(Stack stack);
void PrintStack(Stack stack);
void Pop(Stack stack);
#ifdef __cplusplus
}
#endif
二。编写一个C++风格的头文件,在这里添加extern修饰符。
使用方法一,很简单。但是如果该头文件是别人写好,你无法修改。这个时候就要使用其它方法了。方法是定义C++自己的头文件,文件名为"CStack.h"
// CStack.h
extern "C" {
#include "Stack.h";
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# C++调用C函数
# C++
# 使用C函数的实现方法
# error LNK2019: 无法解析的外部符号 问题的解决办法
# 关于c++编译protobuf时提示LNK2001 无法解析的外部符号的问题
# C++调用C函数报错无法解析的外部命令/无法解析的外部符号问题
# 头文件
# 就会
# 修饰符
# 自己的
# 几个
# 是在
# 在这里
# 两种
# 希望能
# 才有
# 很简单
# 才可以
# 这个时候
# 刚开始
# 报错
# 谢谢大家
# 如何使用
# 要使
# 写好
# 时将
相关文章:
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
如何挑选优质建站一级代理提升网站排名?
制作网站公司那家好,网络公司是做什么的?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
黑客如何利用漏洞与弱口令入侵网站服务器?
香港服务器选型指南:免备案配置与高效建站方案解析
专业商城网站制作公司有哪些,pi商城官网是哪个?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
如何快速生成可下载的建站源码工具?
淘宝制作网站有哪些,淘宝网官网主页?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
如何快速生成专业多端适配建站电话?
宝塔面板如何快速创建新站点?
如何在阿里云高效完成企业建站全流程?
GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?
建站之星如何优化SEO以实现高效排名?
独立制作一个网站多少钱,建立网站需要花多少钱?
如何通过西部建站助手安装IIS服务器?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
怀化网站制作公司,怀化新生儿上户网上办理流程?
如何高效搭建专业期货交易平台网站?
山东网站制作公司有哪些,山东大源集团官网?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
如何通过二级域名建站提升品牌影响力?
云南网站制作公司有哪些,云南最好的招聘网站是哪个?
linux top下的 minerd 木马清除方法
如何用wdcp快速搭建高效网站?
如何构建满足综合性能需求的优质建站方案?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
如何通过免费商城建站系统源码自定义网站主题与功能?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
如何在香港免费服务器上快速搭建网站?
高防服务器如何保障网站安全无虞?
建站之星如何通过成品分离优化网站效率?
如何快速上传自定义模板至建站之星?
建站主机数据库如何配置才能提升网站性能?
魔方云NAT建站如何实现端口转发?
如何选择高效便捷的WAP商城建站系统?
盐城做公司网站,江苏电子版退休证办理流程?
济南企业网站制作公司,济南社保单位网上缴费步骤?
如何通过云梦建站系统实现SEO快速优化?
建站VPS能否同时实现高效与安全翻墙?
Swift中循环语句中的转移语句 break 和 continue
如何快速搭建安全的FTP站点?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
*请认真填写需求信息,我们会在24小时内与您取得联系。