C++代码调用C函数:
在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理:
extern "C"
{
#include "cExample.h"
}
而在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文件中包含了extern "C"时会出现编译语法错误。
笔者编写的C++引用C函数例子工程中包含的三个文件的源代码如下:
//C函数头文件 cExample.h
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
#endif
//C函数实现文件 cExample.c
#include "cExample.h"
int add( int x, int y )
{
return x + y;
}
// c++实现文件,调用add:cppFile.cpp
extern "C"
{
#include "cExample.h"
}
int main(int argc, char* argv[])
{
add(2,3);
return 0;
}
如果C++调用一个C语言编写的.DLL时,当包括.DLL的头文件或声明接口函数时,应加extern "C" { }
C代码调用C++函数:
在C中引用C++语言中的函数和变量时,C++的头文件需添加extern "C",但是在C语言中不能直接引用声明了extern "C"的该头文件,应该仅在C文件中将C++中定义的extern "C"函数声明为extern类型。
笔者编写的C引用C++函数例子工程中包含的三个文件的源代码如下:
//C++头文件 cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif
//C++实现文件 cppExample.cpp
#include "cppExample.h"
int add( int x, int y )
{
return x + y;
}
//C文件 main.c
extern int add( int x, int y );
int main( int argc, char* argv[] )
{
add( 2, 3 );
return 0;
}
总结:
在C++中调用C代码,要在C++文件中加入extern "C" {}去告诉我们的编译器,该段代码使用C的方式调用。因为这些代码是在.c文件中编写,它们是被编译成C的形式,所以需要使用C的调用方式。
在C中调用C++代码,则要在C++文件中加入extern "C",告诉编译器把字段代码编译成C的形式,以便我们在.c文件中直接调用。
extern "C" {}经常在头文件里结合 __cplusplus 一起使用,例如:
#define PR_BEGIN_EXTERN_C extern "C“ {
#define PR_END_EXTERN_C }
#ifdef __cplusplus
PR_BEGIN_EXTERN_C
#endif
extern void function(int a);
#ifdef __cplusplus
PR_END_EXTERN_C
#end
对于C++文件 __cplusplus 会被定义,这样在C++文件中包含该头文件就会自动加入 extern "C" {}
而对于C文件是没有 __cplusplus 的,所以在C文件中包含该头文件就不会加入 extern "C" {}
参考文章:
https://blog.csdn.net/guoxiaoqian8028/article/details/26174443?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0.control&spm=1001.2101.3001.4242