网上这方面介绍的不少,但是有点鱼龙混杂,对初学者而言,信息量太大,反而不容易直接找到自己想要并且正确的,现将比较好的资料整理下,并附上源代码,供初学者参考以及自己后期使用。
两个推荐的原文地址,通俗点的: 1.深入理解C/C++混合编程 2.extern “c”用法解析
C中想调用C++中的成员函数(包括虚函数),则需要提供一个简单的包装(wrapper),参考: 1.C代码中如何调用C++ C++中如何调用C 2.如何用C语言封装 C++的类,在 C里面使用
1. c调用c++(非成员函数):
/*c++的头文件:Animal.h*/ #ifndef _ANIMAL_H #define _ANIMAL_H class Animal { public: Animal(char *); ~Animal(); char* getName(); private: char* name; }; //方法1:加上预处理器名字 #ifdef __cplusplus extern "C" { #endif void print(void);//对外接口,而且必须有一个非类中方法,才能被C调用 #ifdef __cplusplus } #endif //方法2:只能在编译C++时才能引用extern "C", extern "C" void print(void); #endif /*cpp文件:Animal.cpp*/ #include "Animal.h" #include <string.h> #include <iostream> using namespace std; Animal::Animal(char* data) { name = new char[32]; strcpy(name, data); } Animal::~Animal() { if(name) { delete []name; name = NULL; } } char * Animal::getName() { return name; } //告诉C+++编译器,按照C的命名规则编译 extern "C" void print(void) { Animal animal("dog"); char* animal_name = animal.getName(); cout<<"animal_name:"<<animal_name<<endl; } /* *c调用c++中的函数 *不能添加#include "Animal.h"(c++的头文件) *以下面形式声明使用的C函数 */ #include <stdlib.h> extern void print(void); int main(void) { print(); system("pause"); }2. c++调用c:
//c的头文件:c_head.h #ifndef _C_HEAD_ #define _C_HEAD_ extern void print(char* ); #endif //c文件:c_file.c #include <stdio.h> #include "c_head.h" void print(char* data) { printf("%s\n",data); } /* *c++调用c函数 *头文件#include "c_head.h"(c的头文件)这样写 */ #include <iostream> extern "C" { #include "c_head.h" } using namespace std; int main(void) { print("hello"); system("pause"); }