C/C++ 混合编程 互相调用

来源:互联网 发布:mac软件市场 编辑:程序博客网 时间:2024/06/05 00:59

网上这方面介绍的不少,但是有点鱼龙混杂,对初学者而言,信息量太大,反而不容易直接找到自己想要并且正确的,现将比较好的资料整理下,并附上源代码,供初学者参考以及自己后期使用。

两个推荐的原文地址,通俗点的:
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_Hclass Animal{public:    Animal(char *);    ~Animal();    char* getName();private:    char* name;};//方法1:加上预处理器名字#ifdef __cplusplusextern "C" { #endifvoid 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");}
0 0