目录
一、extern "C"是什么?
extern "C"是为了在c++中兼容c代码,表示extern "C"代码中是标准的c 语言代码,要用c的编译器来编译,而不是用c++的编译器来编译
二、用法展示
1.创建静态库
创建一个空项目,我这里命名为DS,然后在属性>>常规中把配置类型改成静态库类型。于是就有了一个名为DS的静态库。
2.在c++文件中调c的静态库代码
1.添加库目录,目录的路径是静态库中的Debug文件。
2.在附加依赖项中加入静态库名.lib,我这里就是DS.lib。注意用分号和原来的隔开。
3.包头文件,找到静态库中要用的头文件,用extern "C"{}包起来。告诉编译器,头文件中的代码是代码,要有c编译器。
3.在C文件中调c++的静态库代码
1.vs的编译器配置同之前c++调c。
2.在c++库中头文件中的函数申明用extern "C"包一下
extern "C"
{
void StackInit(ST* ps);
void StackDestroy(ST* ps);
void StackPush(ST* ps, STDataType x);
void StackPop(ST* ps);
STDataType StackTop(ST* ps);
int StackSize(ST* ps);
bool StackEmpty(ST* ps);
}
3.但是这时还不能完成,头文件会在c项目中展开,但是extern不是c的语法,不能编译通过。于是我们要用条件编译简单处理一下,在c++中就有extern "C"。
#ifdef __cplusplus
extern "C"
{
#endif
void StackInit(ST* ps);
void StackDestroy(ST* ps);
void StackPush(ST* ps, STDataType x);
void StackPop(ST* ps);
STDataType StackTop(ST* ps);
int StackSize(ST* ps);
bool StackEmpty(ST* ps);
#ifdef __cplusplus
}
#endif
也可以这么用,起到的效果是一样的,这样就完成了,这时运行c的项目就可以运行了。
#ifdef __cplusplus
#define EXTEREN_C extern "C"
#else
#define EXTEREN_C
#endif
EXTEREN_C void StackInit(ST* ps);
EXTEREN_C void StackDestroy(ST* ps);
EXTEREN_C void StackPush(ST* ps, STDataType x);
EXTEREN_C void StackPop(ST* ps);
EXTEREN_C STDataType StackTop(ST* ps);
EXTEREN_C int StackSize(ST* ps);
EXTEREN_C bool StackEmpty(ST* ps);