当前位置: 代码迷 >> 综合 >> 【C++】extern “C“
  详细解决方案

【C++】extern “C“

热度:35   发布时间:2023-11-28 01:18:34.0

文章目录

  • extern "C"
    • 1. C++调用C
    • 2. C调用C++
    • 3. 作用

extern “C”

1. C++调用C

程序不能调用程序,程序只能调用库 (静态库或动态库)

如果想要实现C++去调用C

  • 创建工程,找到静态库

在这里插入图片描述

将.c文件的代码写完之后,运行程序,会生成.lib文件

注意:这里是静态库,不需要写main函数,因为不是运行程序


切换到 .cpp文件

一般调用库使用 #include

#include "../."
  • . 一个个点号表示当前文件
  • .. 两个点号表示当前文件的上一个文件
  • 找到 .h文件,其实就是包含一个头文件,就是这个头文件可以不在当前目录或者工程下

但仅仅是这样也不能满足我们的需求,运行的话会显示链接错误,因为**.h文件只包含函数的声明并没有函数的定义**,链接不到定义的.c文件

解决方案:

添加需要链接的文件,在.c文件运行之后的.lib(在debug中)

在这里插入图片描述

C++调用C++、C调用C操作相同

但仅仅是按照上面的方法调用还是会出问题

因为编译是C++编译的,链接的时候,C++的函数名修饰规则,在c形成的静态库符号表中找不到,链接时候去符号表中找不到这个函数名,通过这段代码可以

extern "c"
{
    #include ".."
}

告诉编译器这段代码函数名风格是用c来写的

2. C调用C++

一样的,出现问题就是在链接上,但这里C++,不支持extern "c"的写法,所以需要在C++的静态库上作修改,让C++编译的时候按照C的函数名修饰方式去形成符号表,在声明的地方加上extern "c"即可,但此时注意不能使用函数重载(因为是C的函数名修饰方式)

但依然存在问题,C编译的时候,把C++ 的.h文件展开,仍然不认识extern c

我们需要用条件编译去处理

#ifdef _cplusplus//指的是如果这是C++文件
#define EXTERN_C extern "C"//C++文件在预处理阶段变成extern "C"
#else
#define EXTERN_C //而在C的预处理阶段的时候,将声明前面变成空(没有),就不会影响编译了
#endif

所以extern "C"总在C++ 中


3. 作用

  • 在公司里,如果要用某个功能,直接需要.h文件和.lib库不去看源代码,直接使用
  • 防止别人看你的源代码,直接给别人.h和.lib文件去让他调用