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

回到正题,在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进行混合编程的更多相关文章

  1. C和C++混合编程中的extern "C" {}

    引言 在用C++的项目源码中,经常会不可避免的会看到下面的代码: 1 2 3 4 5 6 7 8 9 #ifdef __cplusplus extern "C" { #endif ...

  2. [收藏转贴]struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招

    一.C/C++语言 struct深层探索 1.自然对界 struct是一种复合数据类型,其构成元素既可以是基本数据类型(如 int.long.float等)的变量,也可以是一些复合数据类型(如 arr ...

  3. 【C/C++】struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招

    本文为笔者阅读<嵌入式C精华>的摘录,推荐一下,不错的书 一.C/C++语言 struct深层探索 1.自然对界 struct是一种复合数据类型,其构成元素既可以是基本数据类型(如 int ...

  4. extern &quot;C&quot; 的含义:实现C++与C及其他语言的混合编程

    C++中extern "C"的设立动机是实现C++与C及其他语言的混合编程.        C++为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同.对于函数void ...

  5. extern的使用详解(多文件编程)——C语言

    extern——关键字 extern是C语言中的一个关键字,一般用在变量名前或函数名前,作用是用来说明“此变量/函数是在别处定义的,要在此处引用”,extern这个关键字大部分读者应该是在变量的存储类 ...

  6. C++常考面试题汇总

    c++面试题 一 用简洁的语言描述 c++ 在 c 语言的基础上开发的一种面向对象编程的语言: 应用广泛: 支持多种编程范式,面向对象编程,泛型编程,和过程化编程:广泛应用于系统开发,引擎开发:支持类 ...

  7. iOS开发路线简述

    1 iOS开发环境1.1 开发环境标准的配置是MacOSX+Xcode.MacOSX的话首选用苹果电脑,Macmini最便宜只要4000多就好了然后自己配一个显示器,MacBookPro 也可以,不推 ...

  8. 函数定义从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等

    今天一直在学习函数定义之类的问题,下午正好有机会和大家共享一下. 一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC+ ...

  9. 【转】iOS开发路线简述

    简单看了下楼主说的很详细,尤其是最后面那个图描述很直观,让想学习ISO开发的程序猿很清晰每个步骤学习的内容,在此收藏下. iOS系统以及iPhone的出来都要感谢乔布斯,一个完美主义者,从如此优秀的i ...

随机推荐

  1. hadoop启动namenode日志报这个错,首先说怎么看日志

    hadoop启动namenode日志报这个错,首先说怎么看日志, 启动namenode会有这个,ubuntu: starting namenode, logging to /home/xiaoye/h ...

  2. 读C#图解教程的笔记

    第一章记录: 格式化字符串 Console.WriteLine("{0:D}", 123456789);//表示十进制字符串 Console.WriteLine("{0: ...

  3. 从拥抱开源到回馈开源,灵雀云助力CNCF中国区培训业务

    6月27日,全球首屈一指的开源盛会 2018 LinuxCon + ContainerCon + CloudOpen China (LC3)在中国北京国家会议中心落下帷幕.二度落地中国的LC3大会热度 ...

  4. Excelpackage的简单使用(导出用户信息并保存)

    EPPlus介绍 EPPlus是一个使用Open Office XML(xlsx)文件格式,能读写Excel 2007/2010 文件的开源组件,在导出Excel的时候不需要电脑上安装office. ...

  5. 关于 mysql2 -v '0.3.21'(CentOS7.3)

    个人由于没有安装mysql而是装的MariaDB,所以网上说安装mysql,故没有采用,经查阅资料后,详细情况如下: Gem时报错: [root@localhost ~]# gem install m ...

  6. 7个优秀的国内外移动端web框架(转)

    淘宝SUI Mobile框架   (light7框架 官网:http://www.light7.cn/)官网地址:http://m.sui.taobao.org/ SUI Mobile 是一套基于 F ...

  7. eclipse发布到tomcat

    1.用maven集成的工程,在发布的时候,发现其中的变量没有改变,类似${}不存在之类 解决方式:这个类问题是由于缓存导致,基本方法就是clean一下,重启eclipse,最后不行重启电脑 2.今天遇 ...

  8. CCF后感

    3.21,昨天天梯训练赛完后查CCF成绩,300!小开心~~~我是合格的程序员啦~~~ 问题:第四题,如果输入数据有对于1本身来说 S 1 ,R 1有这个我就gg了,考完一直在担心这个反复看题也看不出 ...

  9. java网络编程学习之NIO模型

    网上对NIO的解释有很多,但自己一直没有理解,根据自己的理解画出下面这个图,有什么不对的地方,欢迎留言指出. 理解是,客户端先与通过通道Channel与连接(注册到服务器端),然后再传送数据,服务器端 ...

  10. 第十八节 JS中的正则表达式

    复习字符串操作: search 查找 substring 获取子字符串 charAt 获取某个字符 split 分割字符串,获取数组 var str = 'abcdefghijk'; alert(st ...