C与C++的编译相关性

C与C++从编译器的角度来说,是高度相关的,C++类可以直接用 C 的结构体实现,C可以直接呼叫 C++ 的类成员函数。比如这段代码

#include <iostream>
#include <stdio.h>
using namespace std;
#pragma pack (push, 1)
//we define 2 classes
class A {
private:
	static uint8_t s;
	uint8_t m1 = 3;
protected:
	uint8_t m2 = 4;
public:
	void add () { cout << m1 * m2 * s<<"\n";}
	virtual void fun () {cout << "(-:<\n";}
};
uint8_t A::s = 10;

class B :public A {
public:
	B():A(){}
	uint8_t m3 = 5;
	virtual void fun () {cout << ")-:<\n";}
};
//we define a C struct
struct sblock {
	void ** fun;
	uint8_t m1;
	uint8_t m2;
	uint8_t m3;
};

#pragma pack(pop)


typedef void (*c_fun) (void *);
int main(int /*argc*/, char * /*argv*/[])
{
	//block is a struct
	sblock block;
	void * blockfun = ( void * ) &B::fun;
	block.m1 = 3;
	block.m2 = 4;
	block.m3 = 5;
	block.fun = &blockfun;

	//we force a pointer convert
	A * p = (A *) &block;
	//call 
	p->add();
	p->fun();

	//we call a C++ function using C function pointer
	A b;
	c_fun cfun = (c_fun) &A::fun;
	cfun (&b);
	
	return 0;
}

输出结果为

120
)-:<
(-:<

在GNU C++编译器archlinux x64环境测试通过。对GNU C++编译器而言,这种测试尤为简单。对MSVC编译器,就复杂一些。因为windows下,C++ 的成员函数和 C 具有不同的栈操作。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁劲犇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值