C和C++接口混合使用

 __BEGIN_DECLS 和__END_DECLS 这一篇说到了宏定义是为了C、C++之间的混合使用,这一篇来看下如何混合使用接口。

 

其实,最根本就是要知道C++因为重载的缘故,在编译的时候需要将函数的参数类型加上用于区分重载函数。所以在编译的时候,函数需要注意是C接口还是C++接口。

 

C++调用C:

例如一个C++代码中需要调用C库中的funcA(int x),如果只是简单声明该函数,那么编译器认为是C++接口,所以最终函数的符号表示为funcA_int,在链接的时候是无法找到该函数的,因为C库中只有funcA函数。

想要解决这个问题,就需要在声明的时候告诉编译器,这个是C接口,不是C++的:

extern "C" {
    void funcA(int x);
}

 

C调用C++:

有些库C++中已经实现的很完整了,C也是可以拿过来使用的,但是C++中大多是类、成员函数,那么这些在编译成C++库的时候也都是带参数类型,C如果想要使用,需要将其转换成C认识的。

例如,

class A {
    void funcA(int x);
};

如果C中需要使用需要转换一下:

test.h
extern "C" {
    void testCpp(int x);
}


A.cpp
void testCpp(int x) {
    A obj;
    obj.funcA(x);
}

test.c
#include 

int main() {
    testCpp(2);
    return 0;
}

上面A.cpp 在g++编译的时候讲testCpp按照C要求编译生成testCpp,而不是testCpp_int,test.c中就能够识别该函数并进行调用。

 

在Makefile 中可以通过添加:

-Wl,-Map=gcc.map

编译so或bin的时候,通过gcc.map查看符号表

 

 

你可能感兴趣的:(C)