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

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

两个推荐的原文地址,通俗点的: 
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");
}

猜你喜欢

转载自blog.csdn.net/yy_9117/article/details/81271582