微信扫一扫

028-83195727 , 15928970361
business@forhy.com

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;
    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环境测试通过。