C与C++的二进制兼容性
2016-07-05
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 * pthis;
void ** fun;
uint8_t m1;
uint8_t m2;
uint8_t m3;
};
#pragma pack(pop)
int main(int /*argc*/, char * /*argv*/[])
{
//block is a struct
sblock block;
void * blockfun = ( void * ) &B::fun;
block.pthis = █
block.m1 = 3;
block.m2 = 4;
block.m3 = 5;
block.fun = &blockfun;
//we force a pointer convert
B * p = (B *) &block.fun;
//call
p->add();
p->fun();
return 0;
}
输出结果为
120
)-:<
在GNU C++编译器archlinux x64环境测试通过。