extern “C“的使用

目录

引言

1、C++程序调用C的库

2、C程序调用C++的库


 

引言

  有时候在C++工程中可能需要将某些函数按照C的风格来编译,在函数前加extern "C",意思是告诉编译器,将该函数按照C语言规则来编译。比如:tcmalloc是google用C++实现的一个项目,他提供tcmallc()和tcfree两个接口来使用,但如果是C项目就没办法使用,那么他就使用extern “C”来解决。

1、C++程序调用C的库

extern “C“的使用_第1张图片

我们这里以一道栈的OJ为例子:LeetCode.20有效的括号,我们这里是要用到用C语言写的一个静态库的栈方便来调用

extern “C“的使用_第2张图片

 

 1、我们这里先将题目的main函数,以及一些接口函数放在C++的工程文件test.cpp中

 如下图:

extern “C“的使用_第3张图片

2、我们将栈制作成C的静态库(这样我们就可以在C++中直接调用里面的函数)

 ①我们先创建一个新的项目(这里用到的编译器是VS2019),选择windows桌面向导(也可以选择静态库)

 

extern “C“的使用_第4张图片

 ②配置新项目

extern “C“的使用_第5张图片

 ③选择静态库,空项目

extern “C“的使用_第6张图片

 ④将之前用C语言写好的栈的接口函数拷贝到库中

extern “C“的使用_第7张图片

 

extern “C“的使用_第8张图片

 ⑤生成后缀为.lib的库

extern “C“的使用_第9张图片

extern “C“的使用_第10张图片

 3、然后在test.cpp中调用库的头文件

 其中  “../” 表示返回上一层的文件

#include "../Stack1/Stack.h"

extern “C“的使用_第11张图片

之后就可以看到报的红色警告消除了,这样声明头文件,相当于告诉编译器,有这些函数,我们再次编译链接发现“无法解析的外部函数”,我们还需要做一些配置,才能链接起来

extern “C“的使用_第12张图片

 4、再对C++工程属性进行配置

①附加库目录(Stack1下的debug文件)

extern “C“的使用_第13张图片

 

extern “C“的使用_第14张图片

extern “C“的使用_第15张图片

将debug中的Stack1.lib库给放到附加库目录里面去,就是将建立的Stack1中的debug路径拷贝到附加库目录里面

 ②附加依赖项(将库给链接上)Stack1.lib;给加在最前面,注意分号不能丢掉

extern “C“的使用_第16张图片

 5、接下来就到了extern "C"的用处了,在test.cpp前加入

extern "C"
{
#include"../Stack1/Stack.h"
}

extern “C“的使用_第17张图片

最后再编译运行

extern “C“的使用_第18张图片

 调用成功!!

2、C程序调用C++的库

extern “C“的使用_第19张图片

 当我们写C的程序,需要调用C++的库时候,也同样需要extern "C"

1、test.c文件中放main函数和要用的接口函数

extern “C“的使用_第20张图片

 2、将栈制作成为C++的静态库(和上面的过程相同)

extern “C“的使用_第21张图片

 同样编译产生一个后缀为.lib的文件

extern “C“的使用_第22张图片

3、配置属性,附加库目录和附加依赖项(此处不再赘述)

之后编译链接,你会发现又是链接不上

extern “C“的使用_第23张图片

4、extern "C" 派上用场了

这里extern "C" 是使C++静态库以C的函数名修饰规则去处理函数,从而让C文件识别出这些函数并顺利调用。 

我们可以这样改变,利用条件编译的方法,可以使C++的库以C的函数名修饰规则去修饰函数,从而生成.lib

#ifdef __cplusplus
extern "C"
{
#endif

	//初始化栈
	void StackInit(Stack* ps);

	//销毁栈
	void StackDestroy(Stack* ps);

	void StackPush(Stack* ps, STDataType x);

	void StackPop(Stack* ps);

	//当前栈的大小
	int StackSize(Stack* ps);

	//获取栈顶元素
	STDataType StackTop(Stack* ps);

	//栈是否为空
	bool StackEmpty(Stack* ps);

#ifdef __cplusplus
}
#endif 

最后编译链接运行,观察后缀为test.c,证明C调用C++成功 

extern “C“的使用_第24张图片

运行成功!!!

这就是extern "C"的用法啦,谢谢大家!!

你可能感兴趣的:(开发语言,后端,c++)