前言
c++调用c文件
原因分析
总结
解决调用失败问题
思考:那c文件能够调用c函数吗
c代码既能被c++调用又能被c调用
如何在c++代码中调用写好的c接口?你可能会奇怪,c++不是兼容c吗?直接调用不就可以了,那么我们来测试一下,先看看c++如何调用c代码接口的。
一个c语言文件test.c
一个头文件test.h
c++文件调用c函数
执行命令
编译后链接出错:main.cpp对print(int, int)未定义的引用。
那么g++编译器为什么找不到print(int,int)呢,其实在我们学c++重载的时候就提到过c++底层的编译原理。
test.c我们使用的是c语言的编译器gcc进行编译的,其中的函数print编译之后,在符号表中的名字为 print,通过nm查看.o文件.
我们链接的时候采用的是 g++ 进行链接,也就是 c++ 链接方式,程序在运行到调用 <code>print</code> 函数的代码时,会在符号表中寻找 <code>_z5printii</code>(是按照c++的链接方法来寻找的,所以是找 <code>_z5printii</code> 而不是找 <code>print</code>)的名字,发现找不到,所以会提示“未定义的引用”
此时如果我们在对print的声明中加入 extern “c” ,这个时候,g++编译器就会按照c语言的链接方式进行寻找,也就是在符号表中寻找print(这才是c++兼容c),这个时候是可以找到的,是不会报错的。
编译后底层解析的符号不同,c语言是 <code>_print</code>,c++是 <code>__z5printii</code>
修改test.h文件
修改后再次执行命令
运行无报错
实验:定义main.c函数如下
重新执行命令如下
报错:c语言里面没有extern “c“这种写法
为了使得test.c代码既能被c++调用又能被c调用
将test.h修改如下
<code>ps:下期介绍一个source insight的插件,快速生成上面的代码</code>
再次执行命令
结果示意: