当前位置: 代码迷 >> 综合 >> extern c操作
  详细解决方案

extern c操作

热度:48   发布时间:2023-12-04 19:56:18.0

extern c

c++程序如何调用c静态库

创建一个静态库:在vs2019中,首先创建一个空项目,把exe的后缀改成静态库

在这里插入图片描述
cpp项目如何调用这个静态库?也得包它的头文件

#include"../DS/stack.h"//..就是往上一层目录跳,找到相对路径

这时可以编译,但是会发生链接错误
在这里插入图片描述
原因:包含的头文件,只是声明,没有定义
我们需要再配置两个环境
1.在这里插入图片描述
2.添加DS.lib;在这里插入图片描述
到这里如果cpp调用静态库的cpp就通过了,但cpp调用c为什么不行?
因为c和cpp函数名修饰规则不同
该怎么解决?用extern "C"包含调用的头文件

extern "C"
{
    
#include"../DS/stack.h"//..就是往上一层目录跳,找到相对路径
}
告诉c++编译器extern "c"{}里面的函数是c编译器编译的,链接的时候用c的函数名修饰规则去找,就可以链接

c项目如何调用cpp静态库呢?
extern "C"
{
    void StackInit(ST* ps);void StackDestroy(ST* ps);void StackPush(ST* ps, STDataType x);void StackPop(ST* ps);STDataType StackTop(ST* ps);bool StackEmpty(ST* ps);
}

如果我们只是简单的把cpp静态库里函数的声明用extern “c”{}包起来是不行的

因为c项目了会把头文件展开,而c编译器不认识extern “c”

这里我们用条件编译

//C++静态库,就会按c的函数名修饰规则处理以下函数
#ifdef __cplusplus
extern "C"
{
    
#endifvoid StackInit(ST* ps);void StackDestroy(ST* ps);void StackPush(ST* ps, STDataType x);void StackPop(ST* ps);STDataType StackTop(ST* ps);bool StackEmpty(ST* ps);
#ifdef __cplusplus
}
#endif

C++中有__cplusplus标识符,而C中没有__cplusplus标识符
或者按下面这样

#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C//被替换成空
#endif
//extern "C"告诉编译器按c的函数名修饰规则处理
EXTERN_C void StackInit(ST* ps);
EXTERN_C void StackDestroy(ST* ps);
EXTERN_C void StackPush(ST* ps, STDataType x);
EXTERN_C void StackPop(ST* ps);
EXTERN_C STDataType StackTop(ST* ps);
EXTERN_C bool StackEmpty(ST* ps);
总结:C++程序 调用 c的库,在C++程序中加extern "C" || C程序 调用C++的库,在C++库中加extern "C"