c与c++的struct方法兼容调用

之前写jni代码的时候,在jni.h里定义的JNIEnv定义是不同的类,思考了c++与c调用结构体的方法的方式。使用公共的h文件来包含不同的结构体来实现兼容,c++层需要包含c层的结构体指针。

各个文件定义

test.h

#pragma once

struct classCLay {

    void(*fun1)(int);
};

struct classCppLay {

    struct classCLay* s;
#if defined(__cplusplus)
    void fun1(int i) {
        s->fun1(i);
    }
#endif
};



#if defined(__cplusplus)
typedef classCppLay testClass;
#else
typedef struct classCLay* testClass;
#endif


void test(testClass* t);


test.c

#include "test.h"


void test(testClass* t) {

    (*t)->fun1(5);

}

main.cpp

#include "stdafx.h"

extern "C" {

#include "test.h"
}


void ffffdss(int i ) {
    printf("testint %d \n",i);
}

int main() {


    classCppLay* c = new classCppLay();
    c->s = new classCLay();
    c->s->fun1 = ffffdss;
    c->fun1(5);
    test(c);
    system("pause");
    return 0;
}

这样可以看到c++下和c下定义的typedef是不同类型的,然而在c++文件中初始化之后传入c也是可以同样兼容调用的。

你可能感兴趣的:(c语言知识)