栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C调用C++类成员函数--实例

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C调用C++类成员函数--实例

目录

 

1. 问题成因

2.C++程序

2.1 add.h

2.2 add.cpp

3. 中间封装程序

3.1 myadd.h

3.2 myadd.cpp

4. C主程序 main.c

5. 编译执行


 

1. 问题成因

C与C++调用问题原因主要在于C编译器和C++编译器的不同。C是过程式语言,C编译器编译后,函数在符号库中就是函数名,没有其他任何附加信息。而C++是对象式语言,支持函数重载,C++编译器编译后,在符号库中的名字包含了函数名、函数参数类型和函数返回类型等。因此,当两者混合编译时,会相互找不到对象。

在C和C++混合编程中,常见的是C++调用C,这种是比较简单的,一个extern “C”{}即可解决问题。而C调用C++则是使用相对较少的,我们通过一个实例来说明C如何调用C++类成员函数。

2.C++程序

2.1 add.h
#ifndef ADD_H
#define ADD_H

class addCode
{
public:
	addCode();
	~addCode();

	void setNum(int a);		
	int getNum();
private:
	int m_a;	
};

#endif

2.2 add.cpp
#include 
#include "add.h"

addCode::addCode()
{
	m_a = 0;
}

addCode::~addCode()
{
}

void addCode::setNum(int a)
{
	a++;
	printf("c++ a = %dn",a);
	m_a = a;
}

int addCode::getNum()
{
	return m_a;
}

3. 中间封装程序

通过中间封装程序,实现C与C++之间的转换,中间封装头文件提供给C和C++程序来调用。

3.1 myadd.h

extern “C”{ } 告诉C++编译器以C的规则来链接函数,以便C编译器之后在对象文件中找到正确的符号。#ifdef _ucplusplus 是因为C编译器不知道关键字extern。

#ifndef MYADD_H
#define MYADD_H

#ifdef __cplusplus
extern "C"{
#endif

typedef struct addCode addCode;
addCode* newAddCode();
void interSetNum(addCode *v,int a);
int interGetNum(addCode *v);

#ifdef __cplusplus
}
#endif
#endif

3.2 myadd.cpp
#include "add.h"
#include "myadd.h"

extern "C"{
	addCode* newAddCode(){
		return new addCode();
	}

	void interSetNum(addCode *v,int a)
	{
		v->setNum(a);
	}

	int interGetNum(addCode *v)
	{
		return v->getNum();
	}
}

4. C主程序 main.c
#include 
#include "myadd.h"

int main(void)
{
	int a = 1;

	struct addCode* v = newAddCode();
    //传递参数给C++
	interSetNum(v,a);
	printf("main a = %dn",a);

    //获取C++中参数值
	a = interGetNum(v);
	printf("main get a = %dn",a);

	return 0;
}

5. 编译执行

为了体验过程,我们不再编写makefile,依次使用如下命令行进行编译:

g++ -c add.cpp -o add.o
g++ -c myadd.cpp -o myadd.o
gcc -c main.c -o main.o
g++ add.o myadd.o main.o -o test

编译完成,执行程序,结果如下:

通过上述例子,我们实现了C对C++的调用,大家可以参考。

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/854176.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号