C++虽然兼容C,但是相同的函数经过C编译器和C++编译器的编译后生成的符号不同,所以C++中使用C语言实现的函数,在编译链接的时候会出错。
C++为了与C兼容,在符号的管理上,C++有一个用来声名或定义一个C的符号的“extern C”的用法
add.c
#include"add.h"
int add(int x,int y)
{
return x+y;
}
add.h
#ifndef ADD_H
#define ADD_H
extern int add(int x,int y);
#endif
add.cpp 加上extern"C"之前
#include
#include"add.h"
using namespace std;
int main()
{
cout<<add(2,3)<<endl;
return 0;
}
当我们不引入extern"C"时,在链接时会出现错误
add.cpp 加上extern"C"之后
#include
using namespace std;
extern "C"{
#include"add.h"
}
int main()
{
cout<<add(2,3)<<endl;
return 0;
}
我们经过编译链接之后,成功的输出了结果
add.c
extern int add(int x,int y);
#include
int main()
{
printf("%d\n",add(2,3));
}
add.cpp
#include"add.h"
int add(int x,int y)
{
return x+y;
}
add.h
#ifndef ADD_H
#define ADD_H
extern"C"{
int add(int x,int y);
}
#endif
经过编译链接之后,得到了正确的结果
总结:
(1)C++调用C函数:
//xx.h
extern int add(...)
//xx.c
int add(){
}
//xx.cpp
extern "C" {
#include "xx.h"
}
(2)C调用C++函数
//xx.h
extern "C"{
int add();
}
//xx.cpp
int add(){
}
//xx.c
extern int add();
以上是我在GitHub上学习的笔记,原项目的链接在下面。
CPlusPlusThings