文章目录
- 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文件去让他调用