前言

编译程序的时候出现错误,入口程序如果是cpp文件可以编译成功,如果是c程序则出错。一般这个问题是c与c++之间接口相互调用出现的问题。

出现的错误是undefined reference to 'xxx',一般这个问题是因为程序并没有正确包含所需要的文件导致的。

另外,还需要区别是调用函数还是调用函数库,这个的调用方式也是有不同的。

项目中经常使用C和C++混合编程,那么,在调用对方接口时,总是不可避免地出现问题。为了让双方和谐地工作,就得用到extern "C"。

问题

在C++中,为了支持重载机制,在编译时,要对函数的名字进行一些处理,比如加入函数的返回类型等来加以区别;在C中,只是简单的函数名字而已。如函数void func(int i),C++会把它编译成类似_fun_int或_xxx_funIxxx这样的增加了参数类型的符号,这也是C++可以实现重载的原因;C则把该函数编译成类似_fun的符号,C链接器只要找到该函数符号就可以链接成功,它假设参数类型信息是正确的。故而,关键问题是,C和C++在编译时生成函数名字的方式是不同的。

方法

extern "C"是C++的特性,是一种链接约定,它并不影响调用函数的定义,即使做了该声明,对函数类型的检查和参数转换仍要遵循C++的标准,而不是C。主要是为了解决C++在调用C函数库时,用C++直接链接就会出现不能识别符号的问题,而用上extern "C"后,告诉C++编译器要以C语言的方式编译和链接函数,即直接使用函数名而不是一个经过处理的函数名。

示例

1.C++中调用C接口

ddd

2. C中调用C++接口

ddd

3. C++中调用C库的函数

ddd

4. C中调用C++库的函数

ddd

参考

1. C与C++接口相互调用;

最新文章

  1. TODO:Golang Linux进程退出说明
  2. 大二在CSDN的博客整理
  3. Linux chroot 并使用之前系统设备节点
  4. CentOS 安装rz和sz命令
  5. 在线编辑器的使用-KindEditor
  6. 【TypeScript】如何在TypeScript中使用async/await,让你的代码更像C#。
  7. CentOs6.5中安装和配置vsftp
  8. scala学习笔记:match表达式
  9. Linux系统下定时上传文件至FTP服务器脚本
  10. EasyUI datagrid 的checkbox设置
  11. JVM上的响应式流 — Reactor简介
  12. 详解vuex
  13. awk-for循环简单用法
  14. SpringBoot Laravel(artisan serve) MIXPHP简单性能测试
  15. 下载编译安装Apache HTTP Server 2.4.23以及配置HTTP/HTTPS反向代理
  16. Android Developers:向其它应用发送用户
  17. Qt Creator 4.3.0,Quick Designer里面也看以同时看到和编辑qml code了(Qt5.9的配套IDE)
  18. STL 算法中函数对象和谓词
  19. ftp 长传报错553 可能是选的目录不对
  20. java动态代码的实现以及Class的卸载 (转至http://dustin.iteye.com/blog/46393)

热门文章

  1. 面试必备技能:HashMap哪些技术点会被经常问到?
  2. 常用Maven插件介绍(转载)
  3. GIL锁是什么鬼?
  4. LeetCode 842. Split Array into Fibonacci Sequence
  5. 程序复杂程度(步长) N
  6. learning java 文件锁
  7. 控制论模型&心流模型&波模型
  8. web 视频播放器clappr 相关
  9. PHP 之循环创建文件夹
  10. rancher2.x的安装