C++代码&C代码能否互相调用?答案是肯定的
大家好,我是安然无虞。 |
文章目录
- 前文回顾
- C++调用C语言代码
-
- 如何配置成静态库?
- C++该如何调用配置后的静态库呢?
- C语言调用C++代码
前文回顾
好久不见鸭铁子们,前段时间在备考所以没有及时更新,万分抱歉久等了。
前文说到:【请问】函数重载·真的讲明白了吗?很详细的讲解了函数重载的底层知识,如果有铁子没来得及看前文知识,可以去看一下,绝对通俗易懂能收获到一些东西的。
OK,今天我们讲的是C++&C语言能否相互调用?我们知道C++语言尽管是在C语言的基础上进行大量补充的语言,但是C++语言和C语言依然是不同的编程语言,那么C++和C语言可以互相调用吗?答案是肯定的,详细请看下文。
C++调用C语言代码
之前我们在学习栈这个数据结构的时候,我有讲解过有效的括号 这一题目,那时候还没有学习C++的STL,所以需要自己用C语言代码去手动实现一个栈出来,代码如下所示:
这里说的C++调用C语言代码是什么意思呢?意思是主函数部分是用C++写的,栈这个数据结构是用C语言写的,那么我们怎么在C++项目里调用C语言代码呢?
如何配置成静态库?
这里以VS编译器为例:首先建立一个C语言项目,在里面用C语言实现一个栈,如下图所示:
Stack.h文件:
Stack.c文件:
这样还不可以,毕竟要将它封装成为一个静态库,供C++调用(其实动态库也行,这里统一封装成静态库,后面再解释何为动/静态库)。
怎么封装呢,像下面这样:
然后:
最后,这还没有结束,还需要再运行一下程序。这样就将C语言代码配置成静态库了。
C++该如何调用配置后的静态库呢?
首先需要另外再建立一个C++项目,然后具体操作如下:
然后:
找到上个C项目的Debug,然后点击确定
这个时候还不够,还需要执行一次操作:
对第3步操作还需要说明一下:之所以加上"Stack_C.lib;",是因为要在上一步的附加库目录中找静态库,我们知道.lib是静态库文件的后缀。(不一定是Stack_C,根据自己的文件来),这样点击确定就可以了。
不过在此之前呢,还需要在C++项目中加上一条代码:
先解释这条代码的意思:
#include"../../Stack_C/Stack_C/Stack.h"//注意..表示的是上层目录,所以../../表示向上跳两层目录
为什么要向上跳两层目录呢,这也是根据自己的文件来的,在你创建的C++项目中,找到那个C语言创建的栈这个数据结构的头文件。
那extern "C"又是什么意思呢?
extern "C"的意思是告诉编译器,extern"C"声明的函数属于C语言库,要用C语言的方式去链接调用。
注意extern “C” 只在C++编译器中有用,C语言编译器不识别。
对了,你可能会问,为啥要加上extern"C",难道你忘了,本题中的栈是用C语言实现的,而C++底层对于函数名的修饰规则不同于C语言,如果按照C++的方式在符号表中找函数名,肯定找不到,这时候就会出现链接错误,故而要采用C语言的方式去找。
C语言调用C++代码
我们知道C语言的出现要早于C++,这时候你可能就会问那怎么会有C语言调用C++代码的情况呢?其实是有的,所以要需要好好学习哦。
还是以上题为例,只需要稍加调整即可,也就是用C++代码实现栈这个数据结构,其实很简单,只需要将原先的Stack.c 文件改成 Stack.cpp文件即可,然后再将其配置成静态库即可具体操作同上,这里就不再赘述了。
然后就是C语言该如何调用配置后的静态库这个问题了,在操作上跟上面的方法一样,不过需要注意的是,C++项目中的Stack.h头文件有几点需要注意:
在此之前呢,我们先说一下C语言程序(有主函数的那一个):
注意看和上面的方法有什么区别。然后接下来说的是C++项目中的Stack,h 头文件:
这里会相比上面的方法要复杂一些,因为是C语言调用C++代码,所以要按照C语言的方式链接,这个时候Stack.h中需要再加上这段代码:
看,这里就用到C语言那个时候学的条件编译了,可能有铁子会问:为什么还要加上1~5行代码,删去不行吗?也就是这样:
答案是不行,你别忘记了,Stack.h文件会在C语言项目中展开,而C语言编译器不识别extern “C”,所以才要像上面那样。
但是当函数声明有很多的时候,每次都EXTERN_C这样就有点麻烦了,所以我们还可以这样改动:
这样的话就不需要定义宏了,也简洁了不少,不过还需要我们有一定的C语言条件编译的知识,OK,今天就讲到这。