码迷,mamicode.com
首页 > 编程语言 > 详细

【编程语言】extern "C"让C++与C进行混合编程

时间:2019-04-06 23:12:41      阅读:301      评论:0      收藏:0      [点我收藏+]

标签:bsp   oid   pre   名称   一起   编译器   目标   ash   表示   

最近工作不算轻松,现在作为一个项目的负责人统一管理着前端、后端、设计、产品,身上肩负着不小责任,虽然有压力但是对于自己也是一种锻炼。同时自己也在负责整个后端的架构设计,虽然后端经验不是很多,但是自己正是发挥优点的时候。

 

回到正题,在Android NDK开发的时候,我们会遇到extern "C"这个关键字,我们写JNI函数的时候都会加上这个。那么这个关键字到底有什么作用呢?

 

C与C++对函数的处理:

其实编译器对于C与C++文件的处理是不一样的,我们使用编译器(GCC)对于C来说,生成的目标文件中函数的签名就是和原来函数一样(_函数名)。而对于C++来说,生成的目标文件中的函数的签名是和原来的不一样,会在后面添加额外的字符(_函数名_int_int,根据参数个数和类型在后头追加字符)。

 

如果直接将两个目标文件,通过连接器链接一起,如果C++文件引入了C的头文件,则会报错找不到指定的函数。因为编译器对于C++中引入的C头文件,引入的声明函数是以C++方式处理生成目标文件,函数名称也是以C++方式处理。所以在链接器进行链接的时候,C的目标文件中函数就是函数名称,而C++的目标文件中,函数已经名称变了,自然会报错。

 

所以为了解决C++中使用C库文件的问题,就有了extern "C"关键字,他表示将使用C的方式处理函数名,当编译C++文件中带有此关键字的函数或者变量时,生成的目标文件中的函数名是按照C的方式。所以就能将C++和C的库兼容一起,实现C++调用C的库。

 

其他笔记记录

__cplusplus是一个C++预定义的值,通常和extern "C"关键字一起使用:
// __cplusplus是某一个被定义的值

// C++03
__cplusplus = 199711L
// C++11
__cplusplus = 201103L

// 所以编译是否使用C++11,可以进行如下判断:
#if __cplusplus < 201103L
    #error “Should use –std=c++11 option for compile
#endif

// extern “C”可以抑制C++对函数名、变量名进行名称重整,故编译出的C目标文件和C++目标文件名的函数名、变量名都是相同的,链接器能可靠地对两种类型的目标文件进行链接。

#ifdef __cplusplus
extern "C" {
#endif

// 任何变量声明,函数声明。

#ifdef __cplusplus
}
#endif

 

  

【编程语言】extern "C"让C++与C进行混合编程

标签:bsp   oid   pre   名称   一起   编译器   目标   ash   表示   

原文地址:https://www.cnblogs.com/nicojerry/p/10663099.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!